{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6b85ef6d-5a40-444f-92e3-3f3fc2c0facf",
   "metadata": {},
   "outputs": [],
   "source": [
    "!pip install --quiet tqdm neo4j seaborn tiktoken langchain-openai langchain-community langchain-core"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "109c49ae-75f5-4960-a5e5-990a41e2898a",
   "metadata": {},
   "source": [
    "# Integrating Microsoft GraphRAG into Neo4j\n",
    "## Store the MSFT GraphRAG output into Neo4j and implement local and global retrievers with LangChain or LlamaIndex\n",
    "\n",
    "[Microsoft's GraphRAG implementation](https://microsoft.github.io/graphrag/) has gained significant attention lately. In my [last blog post](https://medium.com/neo4j/implementing-from-local-to-global-graphrag-with-neo4j-and-langchain-constructing-the-graph-73924cc5bab4), I discussed how the graph is constructed and explored some of the innovative aspects highlighted in the research paper. At a high level, the input to the GraphRAG library are source documents containing various information. The documents are processed using an Large Language Model (LLM) to extract structured information about entities appearing in the documents along with their relationships. This extracted structured information is then used to construct a knowledge graph.\n",
    "\n",
    "![image](https://cdn-images-1.medium.com/max/800/0*3-dqkOcFxHEYMRKP.png)\n",
    "\n",
    "After the knowledge graph has been constructed, the GraphRAG library uses a combination of graph algorithms, specifically Leiden community detection algorithm, and LLM prompting to generate natural language summaries of communities of entities and relationships found in the knowledge graph.\n",
    "In this post, we'll take the output from the GraphRAG library, store it in Neo4j, and then set up retrievers directly from Neo4j using LangChain and LlamaIndex orchestration frameworks.\n",
    "The code and GraphRAG output are accessible on GitHub, allowing you to skip the GraphRAG extraction process.\n",
    "## Dataset\n",
    "The dataset featured in this blog post is \"A Christmas Carol\" by Charles Dickens, which is freely accessible via the Gutenberg Project.\n",
    "\n",
    "We selected this book as the source document because it is highlighted in the introductory documentation, allowing us to perform the extraction effortlessly.\n",
    "\n",
    "## Graph construction\n",
    "Even though you can skip the graph extraction part, we'll talk about a couple of configuration options I think are the most important. For example, graph extraction can be very token-intensive and costly. Therefore, testing the extraction with a relatively cheap but good-performing LLM like gpt-4o-mini makes sense. The cost reduction from gpt-4-turbo can be significant while retaining good accuracy, as described in this blog post.\n",
    "```\n",
    "GRAPHRAG_LLM_MODEL=gpt-4o-mini\n",
    "```\n",
    "\n",
    "The most important configuration is the type of entities we want to extract. By default, organizations, people, events, and geo are extracted.\n",
    "```\n",
    "GRAPHRAG_ENTITY_EXTRACTION_ENTITY_TYPES=organization,person,event,geo\n",
    "```\n",
    "These default entity types might work well for a book, but make sure to change them accordingly to the domain of the documents you are looking at processing for a given use case.\n",
    "Another important configuration is the max gleanings value. The authors identified, and we also validated separately, that an LLM doesn't extract all the available information in a single extraction pass.\n",
    "\n",
    "![image](https://cdn-images-1.medium.com/max/800/0*Dur0l2MdEydVntKK.png)\n",
    "\n",
    "The gleaning configuration allows the LLM to perform multiple extraction passes. In the above image, we can clearly see that we extract more information when performing multiple passes (gleanings). Multiple passes are token-intensive, so a cheaper model like gpt-4o-mini helps to keep the cost low.\n",
    "```\n",
    "GRAPHRAG_ENTITY_EXTRACTION_MAX_GLEANINGS=1\n",
    "```\n",
    "Additionally, the claims or covariate information is not extracted by default. You can enable it by setting the GRAPHRAG_CLAIM_EXTRACTION_ENABLED configuration. \n",
    "```\n",
    "GRAPHRAG_CLAIM_EXTRACTION_ENABLED=False\n",
    "GRAPHRAG_CLAIM_EXTRACTION_MAX_GLEANINGS=1\n",
    "```\n",
    "It seems that it's a recurring theme that not all structured information is extracted in a single pass. Hence, we have the gleaning configuration option here as well.\n",
    "What's also interesting, but I haven't had time to dig deeper is the prompt tuning section. Prompt tuning is optional, but highly encouraged as it can improve accuracy.\n",
    "\n",
    "After the configuration has been set, we can follow the instructions to run the graph extraction pipeline, which consists of the following steps.\n",
    "\n",
    "![image](https://cdn-images-1.medium.com/max/800/0*s-p5ysea5rpKN8Sf.png)\n",
    "\n",
    "The extraction pipeline executes all the blue steps in the above image. Review my [previous blog post](https://medium.com/neo4j/implementing-from-local-to-global-graphrag-with-neo4j-and-langchain-constructing-the-graph-73924cc5bab4) to learn more about graph construction and community summarization. The output of the graph extraction pipeline of the MSFT GraphRAG library is a set of parquet files, as shown in the [Operation Dulce example](https://github.com/microsoft/graphrag/tree/main/examples_notebooks/inputs/operation%20dulce).\n",
    "\n",
    "These parquet files can be easily imported into the Neo4j graph database for downstream analysis, visualization, and retrieval. We can use a free cloud Aura instance or set up a local Neo4j environment. My friend Michael Hunger did most of the work to import the parquet files into Neo4j. We'll skip the import explanation in this blog post, but it consists of importing and constructing a knowledge graph from five or six CSV files. If you want to learn more about CSV importing, you can check the Neo4j Graph Academy course.\n",
    "\n",
    "The import code is available as a [Jupyter notebook on GitHub](https://github.com/tomasonjo/blogs/blob/master/msft_graphrag/ms_graphrag_import.ipynb) along with the example GraphRAG output."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "c5a1cd8f-9443-4b5d-aa04-00d81c12d35e",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tomazbratanic/anaconda3/lib/python3.11/site-packages/pandas/core/arrays/masked.py:60: UserWarning: Pandas requires version '1.3.6' or newer of 'bottleneck' (version '1.3.5' currently installed).\n",
      "  from pandas.core import (\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "import getpass\n",
    "from neo4j import GraphDatabase, Result\n",
    "import pandas as pd\n",
    "import seaborn as sns\n",
    "import matplotlib.pyplot as plt\n",
    "import tiktoken\n",
    "import numpy as np\n",
    "from langchain_openai import OpenAIEmbeddings, ChatOpenAI\n",
    "from langchain_community.vectorstores import Neo4jVector\n",
    "from langchain_community.graphs import Neo4jGraph\n",
    "from langchain_core.prompts import ChatPromptTemplate\n",
    "from langchain_core.output_parsers import StrOutputParser\n",
    "from llama_index.core.schema import TextNode\n",
    "from llama_index.core.vector_stores.utils import node_to_metadata_dict\n",
    "from llama_index.vector_stores.neo4jvector import Neo4jVectorStore\n",
    "from llama_index.core import VectorStoreIndex\n",
    "from tqdm import tqdm\n",
    "\n",
    "\n",
    "from typing import Dict, Any\n",
    "\n",
    "# Adjust pandas display settings\n",
    "pd.set_option(\n",
    "    \"display.max_colwidth\", None\n",
    ")  # Set to None to display the full column width\n",
    "pd.set_option(\"display.max_columns\", None)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "13f82a1d-1aef-4638-a750-ac055c36349c",
   "metadata": {},
   "source": [
    "## Graph analysis\n",
    "Before moving onto retriever implementation, we'll perform a simple graph analysis to familiarize ourselves with the extracted data. We start by defining the database connection and a function that executes a Cypher statement (graph database query language) and outputs a Pandas DataFrame."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "0197dea4-0739-4b75-94a5-45c21ed4942e",
   "metadata": {},
   "outputs": [],
   "source": [
    "NEO4J_URI = \"bolt://localhost\"\n",
    "NEO4J_USERNAME = \"neo4j\"\n",
    "NEO4J_PASSWORD = \"password\"\n",
    "\n",
    "driver = GraphDatabase.driver(NEO4J_URI, auth=(NEO4J_USERNAME, NEO4J_PASSWORD))\n",
    "\n",
    "def db_query(cypher: str, params: Dict[str, Any] = {}) -> pd.DataFrame:\n",
    "    \"\"\"Executes a Cypher statement and returns a DataFrame\"\"\"\n",
    "    return driver.execute_query(\n",
    "        cypher, parameters_=params, result_transformer_=Result.to_df\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "5a4d6914-4b50-41ed-a1ab-2f3c0b52b404",
   "metadata": {},
   "outputs": [
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      "OpenAI API Key: ········\n"
     ]
    }
   ],
   "source": [
    "os.environ[\"OPENAI_API_KEY\"] = getpass.getpass(\"OpenAI API Key:\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9ae357ba-c988-4d62-85ab-d504ba62c3b6",
   "metadata": {},
   "source": [
    "When performing the graph extraction, we used a chunk size of 300. Since then, the authors have changed the default chunk size to 1200. We can validate the chunk sizes using the following Cypher statement."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "0038386e-53db-4415-8c60-2cfeef4ec9f1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>token_count</th>\n",
       "      <th>count</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>300</td>\n",
       "      <td>230</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>155</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   token_count  count\n",
       "0          300    230\n",
       "1          155      1"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "db_query(\"MATCH (n:__Chunk__) RETURN n.n_tokens as token_count, count(*) AS count\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "266b1f3f-7ac0-4601-803f-fbbee32ce6eb",
   "metadata": {},
   "source": [
    "230 chunks have 300 tokens, while the last one has only 155 tokens. Let's now check an example entity and its description."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "1ad653a6-ae66-4740-9a29-2e10c5110b79",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>name</th>\n",
       "      <th>description</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>PROJECT GUTENBERG</td>\n",
       "      <td>Project Gutenberg is a pioneering organization dedicated to the free distribution of electronic works, with a focus on those not protected by U.S. copyright law. It was initiated by Professor Michael S. Hart and is supported by a network of volunteers and the Gutenberg Literary Archive Foundation. The organization's mission is to increase the number of public domain and licensed works freely distributed in machine-readable form, thereby promoting free access to literature and electronic works. Project Gutenberg owns a compilation copyright in its collection of electronic works, ensuring their accessibility while requiring compliance with specific copyright and distribution guidelines outlined in their license agreement.\\n\\nFor over forty years, Project Gutenberg has been creating and distributing eBooks, offering a vast array of works in various formats, including 'Plain Vanilla ASCII'. Its collection includes notable titles like 'A Christmas Carol', available for free under a license that allows copying, giving away, and re-using with almost no restrictions. The organization operates globally, emphasizing copyright status and adherence to its license, which includes a system of royalty payments and refunds under certain conditions. Project Gutenberg's main search facility is accessible through its website, www.gutenberg.org, facilitating easy access to its extensive library.\\n\\nProject Gutenberg is committed to keeping its collection freely available for future generations, supported by donations and the efforts of its volunteer network. It promotes the creation, modification, and redistribution of eBooks, especially focusing on works that allow for free copying and distribution in the United States under specific terms. The organization is described as being focused on promoting free access to electronic works, ensuring that literature remains accessible to the public while keeping its name associated with shared works in compliance with its agreement.</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                name  \\\n",
       "0  PROJECT GUTENBERG   \n",
       "\n",
       "                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            description  \n",
       "0  Project Gutenberg is a pioneering organization dedicated to the free distribution of electronic works, with a focus on those not protected by U.S. copyright law. It was initiated by Professor Michael S. Hart and is supported by a network of volunteers and the Gutenberg Literary Archive Foundation. The organization's mission is to increase the number of public domain and licensed works freely distributed in machine-readable form, thereby promoting free access to literature and electronic works. Project Gutenberg owns a compilation copyright in its collection of electronic works, ensuring their accessibility while requiring compliance with specific copyright and distribution guidelines outlined in their license agreement.\\n\\nFor over forty years, Project Gutenberg has been creating and distributing eBooks, offering a vast array of works in various formats, including 'Plain Vanilla ASCII'. Its collection includes notable titles like 'A Christmas Carol', available for free under a license that allows copying, giving away, and re-using with almost no restrictions. The organization operates globally, emphasizing copyright status and adherence to its license, which includes a system of royalty payments and refunds under certain conditions. Project Gutenberg's main search facility is accessible through its website, www.gutenberg.org, facilitating easy access to its extensive library.\\n\\nProject Gutenberg is committed to keeping its collection freely available for future generations, supported by donations and the efforts of its volunteer network. It promotes the creation, modification, and redistribution of eBooks, especially focusing on works that allow for free copying and distribution in the United States under specific terms. The organization is described as being focused on promoting free access to electronic works, ensuring that literature remains accessible to the public while keeping its name associated with shared works in compliance with its agreement.  "
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "db_query(\n",
    "    \"MATCH (n:__Entity__) RETURN n.name AS name, n.description AS description LIMIT 1\"\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c0a221c2-b433-47b1-8639-7b0fddf0fec1",
   "metadata": {},
   "source": [
    "It seems that the project Gutenberg is described in the book somewhere, probably at the beginning. We can observe how a description can capture more detailed and intricate information than just an entity name, which the MSFT GraphRAG paper introduced to retain more sophisticated and nuanced data from text.\n",
    "\n",
    "Let's check example relationships as well."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "f046b02e-7fa3-4071-9c32-cdf31b90b8d4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>description</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>\"Project Gutenberg is responsible for releasing 'A Christmas Carol' as an eBook.\"</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>\"Suzanne Shell produced the eBook version of 'A Christmas Carol' for Project Gutenberg.\"</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>\"Janet Blenkinship produced the eBook version of 'A Christmas Carol' for Project Gutenberg.\"</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Project Gutenberg operates within the United States, where it is significantly influenced by U.S. laws, particularly those concerning copyright and the redistribution of eBooks. Its activities, including the creation and distribution of electronic works, are conducted freely within the legal framework of the United States, emphasizing the organization's adherence to copyright law and the conditions under which eBooks can be shared. Project Gutenberg's collection mainly comprises works that are in the public domain in the United States, underscoring a crucial geographical and legal relationship between the organization's operations and U.S. copyright laws. This relationship dictates the accessibility of Project Gutenberg's works and ensures that their distribution is in compliance with U.S. copyright confirmation processes. Overall, Project Gutenberg's presence and operations in the United States highlight its commitment to making literary works accessible within the confines of copyright law, ensuring that donations and the sharing of works are handled in accordance with U.S. regulations.</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>\"Project Gutenberg establishes and enforces the General Terms of Use and Redistributing guidelines for its electronic works.\"</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         description\n",
       "0                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  \"Project Gutenberg is responsible for releasing 'A Christmas Carol' as an eBook.\"\n",
       "1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           \"Suzanne Shell produced the eBook version of 'A Christmas Carol' for Project Gutenberg.\"\n",
       "2                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       \"Janet Blenkinship produced the eBook version of 'A Christmas Carol' for Project Gutenberg.\"\n",
       "3  Project Gutenberg operates within the United States, where it is significantly influenced by U.S. laws, particularly those concerning copyright and the redistribution of eBooks. Its activities, including the creation and distribution of electronic works, are conducted freely within the legal framework of the United States, emphasizing the organization's adherence to copyright law and the conditions under which eBooks can be shared. Project Gutenberg's collection mainly comprises works that are in the public domain in the United States, underscoring a crucial geographical and legal relationship between the organization's operations and U.S. copyright laws. This relationship dictates the accessibility of Project Gutenberg's works and ensures that their distribution is in compliance with U.S. copyright confirmation processes. Overall, Project Gutenberg's presence and operations in the United States highlight its commitment to making literary works accessible within the confines of copyright law, ensuring that donations and the sharing of works are handled in accordance with U.S. regulations.\n",
       "4                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      \"Project Gutenberg establishes and enforces the General Terms of Use and Redistributing guidelines for its electronic works.\""
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "db_query(\"MATCH ()-[n:RELATED]->() RETURN n.description AS description LIMIT 5\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3222f543-4e83-4205-ba28-f93dedfc33a9",
   "metadata": {},
   "source": [
    "The MSFT GraphRAG goes beyond merely extracting simple relationship types between entities by capturing detailed relationship descriptions. This capability allows it to capture more nuanced information than straightforward relationship types.\n",
    "\n",
    "We can also examine a single community and its generated descriptions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "a0b6046f-6c10-40d4-aca0-bb4c5e184c19",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>title</th>\n",
       "      <th>summary</th>\n",
       "      <th>full_content</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>The Cratchit Family: A Study of Resilience and Transformation</td>\n",
       "      <td>The Cratchit family, central to the narrative, showcases themes of love, hardship, and transformation, particularly in relation to their interactions with Ebenezer Scrooge. This report delves into the dynamics within the Cratchit family, their relationship with Scrooge, and the significant impact of Christmas Day on their lives and on Scrooge's transformation. The family's experiences highlight broader societal issues of poverty and the potential for personal change.</td>\n",
       "      <td># The Cratchit Family: A Study of Resilience and Transformation\\n\\nThe Cratchit family, central to the narrative, showcases themes of love, hardship, and transformation, particularly in relation to their interactions with Ebenezer Scrooge. This report delves into the dynamics within the Cratchit family, their relationship with Scrooge, and the significant impact of Christmas Day on their lives and on Scrooge's transformation. The family's experiences highlight broader societal issues of poverty and the potential for personal change.\\n\\n## The pivotal role of Bob Cratchit\\n\\nBob Cratchit, as a devoted family man and employee of Scrooge, represents the struggles of the lower class while maintaining a hopeful and loving demeanor. His relationship with Scrooge evolves from one of power imbalance to mutual respect, marked by Scrooge's transformation and his promise to assist the Cratchit family. Bob's interactions with his family, especially Tiny Tim, underscore his role as a caring father and his impact on Scrooge's change of heart [Data: Entities (11, 177); Relationships (25, 159, 20, 29, +more)].\\n\\n## Mrs. Cratchit's influence and resilience\\n\\nMrs. Cratchit is a strong, caring figure within the family, showcasing resilience in the face of hardship. Her disdain for Scrooge reflects her protective nature and desire for justice. Mrs. Cratchit's efforts to maintain festive spirits, despite financial constraints, highlight her role in fostering family unity and her indirect influence on Scrooge's transformation through her husband's experiences [Data: Entities (26); Relationships (81, 77, 73, +more)].\\n\\n## Tiny Tim as a symbol of hope\\n\\nTiny Tim, despite his physical frailties, embodies hope and innocence. His optimistic outlook and the concern for his well-being from both his family and Scrooge symbolize the potential for societal change. Tiny Tim's character prompts Scrooge's transformation, illustrating the impact of empathy and care on personal redemption. His condition and spirit reflect broader themes of social responsibility and the value of each individual within society [Data: Entities (174); Relationships (158, 289, +more)].\\n\\n## The transformative power of Christmas Day\\n\\nChristmas Day serves as a catalyst for change and reflection within the narrative. For the Cratchit family, it is a time of joy and familial bonding, despite their hardships. For Scrooge, it marks the beginning of his transformation, influenced by the Ghosts and his observations of the Cratchit family. The day's significance is highlighted through the contrast between Scrooge's initial miserliness and his eventual generosity, underscoring the themes of redemption and the impact of kindness [Data: Entities (172); Relationships (160, 286, +more)].\\n\\n## The broader societal implications of the Cratchit family's narrative\\n\\nThe Cratchit family's experiences and their interactions with Scrooge touch on broader societal issues such as poverty, inequality, and the capacity for personal growth. Their story serves as a microcosm for exploring themes of social justice, the importance of family, and the potential for change in individuals and society. Through their resilience and the transformative journey of Scrooge, the narrative offers insights into the power of empathy, community, and the spirit of Christmas in fostering societal change [Data: Entities (180, 149); Relationships (25, 158, 160, +more)].</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                           title  \\\n",
       "0  The Cratchit Family: A Study of Resilience and Transformation   \n",
       "\n",
       "                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   summary  \\\n",
       "0  The Cratchit family, central to the narrative, showcases themes of love, hardship, and transformation, particularly in relation to their interactions with Ebenezer Scrooge. This report delves into the dynamics within the Cratchit family, their relationship with Scrooge, and the significant impact of Christmas Day on their lives and on Scrooge's transformation. The family's experiences highlight broader societal issues of poverty and the potential for personal change.   \n",
       "\n",
       "                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   full_content  \n",
       "0  # The Cratchit Family: A Study of Resilience and Transformation\\n\\nThe Cratchit family, central to the narrative, showcases themes of love, hardship, and transformation, particularly in relation to their interactions with Ebenezer Scrooge. This report delves into the dynamics within the Cratchit family, their relationship with Scrooge, and the significant impact of Christmas Day on their lives and on Scrooge's transformation. The family's experiences highlight broader societal issues of poverty and the potential for personal change.\\n\\n## The pivotal role of Bob Cratchit\\n\\nBob Cratchit, as a devoted family man and employee of Scrooge, represents the struggles of the lower class while maintaining a hopeful and loving demeanor. His relationship with Scrooge evolves from one of power imbalance to mutual respect, marked by Scrooge's transformation and his promise to assist the Cratchit family. Bob's interactions with his family, especially Tiny Tim, underscore his role as a caring father and his impact on Scrooge's change of heart [Data: Entities (11, 177); Relationships (25, 159, 20, 29, +more)].\\n\\n## Mrs. Cratchit's influence and resilience\\n\\nMrs. Cratchit is a strong, caring figure within the family, showcasing resilience in the face of hardship. Her disdain for Scrooge reflects her protective nature and desire for justice. Mrs. Cratchit's efforts to maintain festive spirits, despite financial constraints, highlight her role in fostering family unity and her indirect influence on Scrooge's transformation through her husband's experiences [Data: Entities (26); Relationships (81, 77, 73, +more)].\\n\\n## Tiny Tim as a symbol of hope\\n\\nTiny Tim, despite his physical frailties, embodies hope and innocence. His optimistic outlook and the concern for his well-being from both his family and Scrooge symbolize the potential for societal change. Tiny Tim's character prompts Scrooge's transformation, illustrating the impact of empathy and care on personal redemption. His condition and spirit reflect broader themes of social responsibility and the value of each individual within society [Data: Entities (174); Relationships (158, 289, +more)].\\n\\n## The transformative power of Christmas Day\\n\\nChristmas Day serves as a catalyst for change and reflection within the narrative. For the Cratchit family, it is a time of joy and familial bonding, despite their hardships. For Scrooge, it marks the beginning of his transformation, influenced by the Ghosts and his observations of the Cratchit family. The day's significance is highlighted through the contrast between Scrooge's initial miserliness and his eventual generosity, underscoring the themes of redemption and the impact of kindness [Data: Entities (172); Relationships (160, 286, +more)].\\n\\n## The broader societal implications of the Cratchit family's narrative\\n\\nThe Cratchit family's experiences and their interactions with Scrooge touch on broader societal issues such as poverty, inequality, and the capacity for personal growth. Their story serves as a microcosm for exploring themes of social justice, the importance of family, and the potential for change in individuals and society. Through their resilience and the transformative journey of Scrooge, the narrative offers insights into the power of empathy, community, and the spirit of Christmas in fostering societal change [Data: Entities (180, 149); Relationships (25, 158, 160, +more)].  "
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "db_query(\n",
    "    \"\"\"\n",
    "  MATCH (n:__Community__) \n",
    "  RETURN n.title AS title, n.summary AS summary, n.full_content AS full_content LIMIT 1\n",
    "\"\"\"\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6bb8f680-89f7-4c5b-a34e-4c8be4ee2746",
   "metadata": {},
   "source": [
    "A community has a title, summary, and full content generated using an LLM. I haven't seen if the authors use the full context or just the summary during retrieval, but we can choose between the two. We can observe citations in the full_content, which point to entities and relationships from which the information came. It's funny that an LLM sometimes trims the citations if they are too long, like in the following example.\n",
    "\n",
    "```\n",
    "[Data: Entities (11, 177); Relationships (25, 159, 20, 29, +more)]\n",
    "```\n",
    "\n",
    "There is no way to expand the `+more` sign, so this is a funny way of dealing with long citations by an LLM.\n",
    "Let's now evaluate some distributions. We'll start by inspecting the distribution of the count of extracted entities from text chunks."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "bdce0534-c342-4894-af07-e72f00425828",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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dofjtuTgwYM444wzkJSUhPPPPx9FRUVYt24dpk2bho8//jjY/vHjx6OsrAyffvop+vTp0+zfiBOH9BJRAol01kZEFC5o57f/Dz30kAAgrr766pMef+K31Oeee64AIN59992T4nz77beirq4u+HvTb7Rb0rQX4Oc//3mLvS+n6mnSarXiww8/DG53uVzimmuuEQDE5Zdf3uwxoX4r35LWepreffddAUDk5eWJ3bt3B7fX1NSI8ePHCwDitttua7F9siyL9957L7jd4/GIGTNmCADinnvuabEdJ1IURQwbNkwAEHfccUezHpJ3331XyLIsrFarKCkpafa4pj14HdHez1pLjxk0aJAoLS0Nbt+/f79ITU0VAMTevXubPaZnz55tnqe197itx9XU1Aiz2SyysrKE0+lsts/r9YqCggKh0WjEkSNHTvmcXnjhBQFAnH/++ac89kTffvtt8H1Zv359cLvD4RC//OUvBQAxY8aMZo8J5TMd+Ax6vd7gvscff1wAEOecc06zxzTtFSYiEkIIlhwnooQT+Mb92LFjpzy2oqICADB58uST9gW+te4og8GAf/7znzAajR1+7BVXXIGLL744+LtOp8M//vEPmM1mfPDBByguLu5wzHB48sknAQD33nsv+vXrF9yekpKCJUuWQJIkPPfcc3A4HCc99uqrr8a0adOCv2s0GixcuBAA8NVXX7Xr/KtXr8bWrVtRUFCAhx56qFkPyYwZMzBt2jQ0NDTgpZde6szTa1VbJccDRSZO9OSTTzbrzSosLMTMmTMBAP/73//C2r6WpKSk4KqrrkJFRQX+/e9/N9v33//+F0VFRbjkkkuQl5d3ylhVVVUAgKysrA6346mnnoKiKLjlllswZsyY4HaDwYCnnnoKJpMJ7733Xtg+04WFhVi0aBFk+filz/z585GWlob169fD5XKF5TxEFJ+YNBFRwhH+MsynGnoEIFg2+de//jW+++47KIoS8vlHjRqF7t27d+qxV1111UnbAkOjhBARmWjvdruxfv16AMA111xz0v7hw4dj+PDhaGhowObNm0/a39Kwrv79+wMASktL29WGQLJxxRVXtFgB8de//nWz48Jl1qxZrd5aqmin0+kwceLEk7Z39PmG6uabbwYAvPDCC822B36/8cYbVW9D4L1o6TPTrVs3XHjhhVAUBWvXrg3L+c477zzo9fpm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CIFymxcAkGPWdDqOVtIixZgBrdS5j7QsSTi9mwlfHmnEdxV2jMgwQJKa9DZptUBmpu+eiIiIKM5NnToVLpcLkiRhypQpzfYNHjwYBoMBRUVFmDBhQouPHzRoED744INm29afOLzwBGvXrsXs2bPx85//HIAvOTuxeESk8AqQIuqYU4FLEdBKQIax80lTn4yhWHntoZDaMiLDgLWlNlQ5vNhf50afFP3xncOH+yZZEhERESUAjUaDnTt3Bn9uKikpCbfffjsWLFgARVEwfvx41NbWYu3atUhOTsasWbNw880347HHHsP/+3//D9dffz02btyIl19+uc1z9uvXDytWrMCll14KSZJwzz33qN6D1F6snkcRVWYPLGarhSxFdh6RQSNjhH9Y3rdH2yg/TkRERJQAkpOTkZyc3OK+Bx98EPfccw8WL16MQYMGYerUqfjwww9RWFgIACgoKMC//vUvvP/++xgxYgSeffZZLFq0qM3z/f3vf0daWhrOOussXHrppZgyZQpGtTVksQtJQog2VvSMP3V1dUhJSUFtbW2rHwI6tU2bNmH06NF44ZOvMWD4yE7FcHgVbKxwAgBGZRpgCmE+04HqHbjrv1dh0YXLUZg+uM1jd/24GTdMHY+NGzee9IdY6/Li2e3HIABcNyAV2WZ/Z+z27cDllwP//jcwZEin20lERETxzeFw4MCBAygsLITRyDnS0aCt96S9uQF7mihiAnOZUvRySAkTALgUF47U7YdLcZ364Dak6DUYlOabwNist8npBPbt890TERERUUJh0kQRoQgRrJqXY46uqXVndPN9A/FTjbP1xW6JiIiIKGEwaaKIqHEpcCuATgbSDdH1Mcw165Bt0sArgG3V7FkiIiIiSnTRdbVKCaPS7hual2nURLwAREsC6zRtqXIgwab9EREREdEJmDRRl/MKgWrn8aQpHHok98ajF72PHsm9wxJvcJoBOhmocnhxpNED9O0LfPKJ756IiIjoFPila/QIx3vBpIm6XI1TgVcABllCki48H0GLPhln5k+GRR+eiogGjYyBqb6CEJurHEByMjBliu+eiIiIqBU6nQ4AYLPZItwSCgi8F4H3pjOiawY+JYQKh7+XyaSBFKaheZW2MnywYykuGzwXmeacsMQcmWnE1monfjrmxGS5DsalLwA33QTk5oYlPhEREcUfjUaD1NRUHD16FABgNpvDdr1DHSOEgM1mw9GjR5GamnrSIr0dEVVJU69evXDo0KGTtv/2t7/FkiVL4HA4cNttt2H58uVwOp2YMmUKnn76aWRnZ0egtdQZHkXgmCO8Q/MAoMpWhpc3LcbZvS4JW9KUZ9Yi06hBpcOLA7sPYdD99wOXXcakiYiIiNqUk+O7FgkkThRZqampwfeks6Iqafruu+/g9XqDv2/btg0XXHABfvnLXwIAFixYgA8//BDvvPMOUlJSMH/+fEyfPh1r166NVJOpg445vVAAGDUSLNro/tZFkiSMyDDiiyON2F3jwqBIN4iIiIhigiRJyM3NRbdu3eB2uyPdnISm0+lC6mEKiKqkKSsrq9nvDz/8MPr06YMJEyagtrYWS5cuxZtvvolJkyYBAJYtW4ZBgwZh/fr1GDt2bCSaTB1U0aSXKRa6qoemG7C6pDFYuIKIiIiovTQaTVgu2CnyorYQhMvlwuuvv445c+ZAkiRs3LgRbrcbkydPDh4zcOBAFBQUYN26da3GcTqdqKura3ajyPAoAjVO32KxWWEcmqcmk1bGAH9BCCIiIiJKTFGbNL3//vuoqanB7NmzAQBlZWXQ6/VITU1tdlx2djbKyspajbN48WKkpKQEb/n5+Sq2mtpS5fBCADBrJZjDVDUvIEmfigv6XokkfWpY4wLAkDQDHMmp+OmSX8B7wuePiIiIiOJf1CZNS5cuxUUXXYS8vLyQ4ixcuBC1tbXBW3FxcZhaSB1VqUIBiIC85F64Z9JS5CX3CnvswmQd3D174f0Hn8HBjB5hj09ERERE0S2q5jQFHDp0CJ9//jlWrFgR3JaTkwOXy4WamppmvU3l5eVtVsMwGAwwGDi8KtI8ikCtyzc0L0OFpMnpcaCi8QiyLN1h0BrDGluWJAwxCezZvh87zYXok5J16gcRERERUdyIyp6mZcuWoVu3brjkkkuC20aPHg2dTocvvvgiuG3Xrl0oKirCuHHjItFM6oBalwIBX9U8kyb8BSAO1vyEX701Agdrfgp7bAAYXr4fN08bg2M//AiXlyt8ExERESWSqOtpUhQFy5Ytw6xZs6DVHm9eSkoK5s6di1tvvRXp6elITk7GLbfcgnHjxrFyXgwIVJ9LM8gxUTXvRIEhhR4F2F3rxND08PZmEREREVH0irqk6fPPP0dRURHmzJlz0r7HH38csixjxowZzRa3pegmhMAxf9KUboiNqnknapro7ahm0kRERESUSKIuabrwwgshRMvDn4xGI5YsWYIlS5Z0casoFA1uAbcCaCQgWR+VI0I75EC9G41uBZYwVwAkIiIioujEqz5SXWBoXqpBAzkGh+Y1lWXUQgDYccwZ6aYQERERUReJup4mij/VwaF56uXoAzJH4qsbG1SLj1GjACGQW2HHtsON2HHMiTO6mdQ7HxERERFFDfY0kaocXgU2j2+4ZVqMzmdqamCqARKAUpsHNf5kkIiIiIjiG5MmUtUxh29tpmSdDJ2s3tC8oprd+M37k1BUs1udE+zaBYwbB8v+PSiw6nybajhEj4iIiCgRMGkiVTUtNa4mu8eG7Ue/hd1jU+cEjY3A+vVAYyMGpOoBAD/VuNQ5FxERERFFFSZNpBqvIlDr8vU0pRtjf2hewIBUAwDfEL1aF4foEREREcU7Jk2kmhqXAgHAoJFg0sR21bymLDoZ+VZfDZWfWEWPiIiIKO4xaSLVBHph0vRys8Vh48FAf2/TLg7RIyIiIop7TJpINTVO39C81C6ompdrLcDdE19ErrVAnRP06gW89prvHseH6JXYPKjjED0iIiKiuMakiVTh9ArYvb5S4yl69T9mycZ0XNjvKiQb09U5QXo6MHOm7x6AVSejh8U3RI+9TURERETxjUkTqSIwNM+qk6BVsdR4QI29Aiu2P4cae4U6J6ioAJYs8d37BYbo/cTS40RERERxjUkTqSI4NE/fNVXzyhuP4Im1t6G88Yg6JyguBubP9937BUqPH2nkED0iIiKieMakicJOCIEafxLRFUPzIiVJr0F3/xC93RyiR0RERBS34veKliLG7hFwK74PV3IcJ00A0D/F19u0p5ZJExEREVG8iu8rWoqIGv+Ctsl6GXKclRo/UX//vKaiBjccHiXCrSEiIiIiNTBporALDs0zdN3Hy6yz4owe58Oss6pzgqQk4MILffdNpBk0yDRqIADsq2NvExEREVE80ka6ARRfFCFQ6+raIhAAkJ/SF49d/G/1TtCvH/Dppy3vStGj0mHHnloXhqQb1WsDEREREUUEe5oorBrcChQBaCXAou26oXlexYtGVx28ikpV7LxeoK7Od3+Cfv55Tfvr3PAoQp3zExEREVHEMGmisAqWGjdoIHXhfKa91Vtx0ct52Fu9VZ0TbNkCpKT47k+Qa9bCqpXhUgSKGtzqnJ+IiIiIIoZJE4VVoAhEPJcaP5EkSejLKnpEREREcStxrmxJdV4h0OBOvKQJOD5Eb0+tC0JwiB4RERFRPEmsK1tSVYNLgQCglwGjJr5LjZ+oZ5IOOtk3p6vM5ol0c4iIiIgojJg0UdjUuQPrM3XtfKZooJUl9E7mED0iIiKieMSkicKmtsmitl2tT/oQfPDrA+iTPkSdEwwbBhw96rtvRT/OayIiIiKKS0yaKCwUIVAf6GnSdf3HSivrkGrKglbWqXMCnQ7IyvLdt6JPsh4SgAqHF7UulUqfExEREVGXY9JEYdHoFsH1mcxduD5TwJG6/fjjJ1fgSN1+dU6wbx9w2WW++1aYtDK6W3zrRe9jbxMRERFR3GDSRGFR5/b1rCTp5YjMZ2pw1eGboo/Q4KpT5wS1tcDKlb77NvTxz2vaV8ekiYiIiCheMGmisKiL4HymaNLHP6/pUL0bboWlx4mIiIjiQWJf4VJYCCGCSVOKThPh1kRWllGDJJ0MjwCK6t2Rbg4RERERhQGTJgqZ3SPgEYAsARZdYpUaP5EkSRyiR0RERBRnmDRRyGr9VfOSdDLkCK3PlGXOxbyxi5FlzlXnBN27A4895rs/hT4pvgp7++pcEIJD9IiIiIhinTbSDaDYFw3zmdLN2bhy+C3qnSA7G7j11nYd2tOqh0byrVtV5fQi08g/MyIiIqJYxp4mCokAUOdfkygS6zMF1DuPYdX+Fah3HlPnBMeOAe+847s/Bb1GQoHV39vE0uNEREREMY9JE4VEkXVwKYAEX7nxSCmpP4R7P78WJfWH1DnBgQPAFVf47tvh+LwmFoMgIiIiinVMmigkbr0JAGDVSdBEaD5TNAqUHj/c4IbDq0S4NUREREQUCiZNFBKP1ggASErwUuMnSjNokG7QQAFwkKXHiYiIiGIakyYKiVvn62mK5NC8aNUn2TevaT/nNRERERHFNF7pUqfpjCZ4tQYAQFKE12cyaIzolzECBo1RnROYTMBpp/nu26nQP6/pQL2bpceJiIiIYhhrIVOndR80ApAk6GVAL0c2aeqVNhBLZ6xV7wSDBgGbNnXoIflWHbQSUO9WUOXwItPEPzciIiKiWMSeJuq0/GGjAfgWtZVYBOIkOllCvr/0+H7OayIiIiKKWUyaqNPyh/qSJmsE12cK2F25Bee/mI7dlVvUOcEPPwAGg+++A3ol+ZKmg3Wc10REREQUqyJ/tUsxqyDQ0xQFRSAEBNyKCwIqzR0SAnC5fPcd0Ns/r6mowQ2PwnlNRERERLEo8le7FJMc0CAlOw8QAlYtP0atyTRqkKST4RFAcQOH6BERERHFIl7tUqfUwNeDovE4oYlwEYhoJklScIjeAc5rIiIiIopJTJqoU2rhKzWuc9sj3JLoFyw9znlNRERERDGJNZCpU2r9PU1ajyPCLfHplToAr/ziW+QlF6pzgkGDgG3bgN69O/zQQn9PU4XDi3q3F0k6TbhbR0REREQqYk8TdZhXEajzJ03R0tNk0JpQmD4YBm37F5/tEJMJGDKkQ4vbBh+qlZFr9n0/caCOQ/SIiIiIYk3UJU1HjhzBzJkzkZGRAZPJhGHDhuH7778P7hdC4M9//jNyc3NhMpkwefJk7NmzJ4ItTjxHHR4okgxb7THI3uhIAsrqi/DImnkoqy9S5wSHDgHXX++774RAb9NBzmsiIiIiijlRlTQdO3YMZ599NnQ6HT7++GPs2LEDjz32GNLS0oLH/PWvf8WTTz6JZ599Fhs2bIDFYsGUKVPgcETHMLFEUNLoAQAUb9uEaCkBUeusxoe7XkGts1qdE1RVAUuX+u47ITivqd4F0cGy5UREREQUWVE1p+mRRx5Bfn4+li1bFtxWWHh8jooQAk888QTuvvtuXH755QCAV199FdnZ2Xj//fdx1VVXdXmbE1Ewadr6PdCvR4RbExvyLFroZQl2j0C53Yscc1T96RERERFRG6Kqp+mDDz7A6aefjl/+8pfo1q0bTjvtNLzwwgvB/QcOHEBZWRkmT54c3JaSkoIxY8Zg3bp1LcZ0Op2oq6trdqPQlNh8Q8yKt22KcEtih0aSkG/1JUoH61lFj4iIiCiWRFXStH//fjzzzDPo168fPv30U/zmN7/B7373O7zyyisAgLKyMgBAdnZ2s8dlZ2cH951o8eLFSElJCd7y8/PVfRJxzuFRcMypAAAOb/8hwq2JLb2SfEP0DnFeExEREVFMiaqkSVEUjBo1CosWLcJpp52GG2+8ETfccAOeffbZTsdcuHAhamtrg7fi4uIwtjjxlNl9Q/NMwgNb7bEIt+a4dFM3XDPyNqSbuqlzguxs4I9/9N13UmCR2+IGNzwK5zURERERxYqoSppyc3MxePDgZtsGDRqEoiJfRbScnBwAQHl5ebNjysvLg/tOZDAYkJyc3OxGnVdm8yVNyYiuIWZZljzcdOb9yLLkqXOC7t2BxYt9952UadTAopXgEcCRRvY2EREREcWKqEqazj77bOzatavZtt27d6Nnz54AfEUhcnJy8MUXXwT319XVYcOGDRg3blyXtjVRHU+anBFuSXM2Vz1+KPkKNle9OieorwdWr/bdd5IkSRyiR0RERBSDoqqE14IFC3DWWWdh0aJFuOKKK/Dtt9/i+eefx/PPPw/Ad9H5hz/8AQ899BD69euHwsJC3HPPPcjLy8O0adMi2/hOKioqQmVlZaSb0W6HkAtIOtQU7Y10U5oprtuH3//nYrww/WsMyBwZ/hPs2QNMnAhs3AiMGtXpMD2TdNh+zImD9W6cG8bmEREREZF6oippOuOMM/Dee+9h4cKFeOCBB1BYWIgnnngC11xzTfCYO+64A42NjbjxxhtRU1OD8ePH45NPPoHRaIxgyzunqKgIgwYNgs1mi3RT2sWYlIJ71/iSpVtm/QoA0NDQEMkmxZye/nlNpTYPHF4FRk1UdfYSERERUQuiKmkCgJ/97Gf42c9+1up+SZLwwAMP4IEHHujCVqmjsrISNpsNdz+1FD37Doh0c07JpTOjDoDsdeFXv/kdlj7yABcV7qAUvQbpBg2qnV4U1bvRP9UQ6SYRERER0SlEXdKUiHr2HYABw0dGuhmndLjBjboGD9IsJuT26Bnp5sSsnkk6VDu9ONTApImIiIgoFnBsELVbg8dXJtuqlSLckpNpZS2yLHnQyip9D6DT+Srn6XQhhwqUHj/IYhBEREREMYE9TdRujW7forZWXfTl2n3Sh+Jf1+xW7wTDhgGHD4clVIHVlzRVObyod3uRpNOEJS4RERERqSP6rn4pKnkUAYfX39MUhUlTLDFpZeSYfd9XsPQ4ERERUfTj1S+1S4O/l8mokaCVo2943r7qbZjxRn/sq96mzgm2bgV69PDdhwGH6BERERHFDiZN1C6BpMkSpb1MHsWDisYSeBSPOidwu4EjR3z3YdDTP0SvqN4NIURYYhIRERGROqLzCpiiTjQXgYhF3S06yBJQ51ZQ61Ii3RwiIiIiagOTJmqXaC4CEYv0Ggl5gXlNDRyiR0RERBTNeAVMp+RmEQhVFDQZokdERERE0YtXwHRKjVFeBAIA8pP74B8/+wj5yX3UOUG/fsCqVb77MCnwF4M41MB5TURERETRjOs00SlFexEIADDrk3Ba3rnqnSApCTjvvLCG7G7RQSP5Xt9jTgXpRq7XRERERBSNovcqmKJGYwwUgahoLMFz396LisYSdU5w5AiwcKHvPkx0soQ8S2BekytscYmIiIgovJg00Sk1xkBPU7X9KN7Y/Biq7UfVOUF5OfDww777MOpp1QPgvCYiIiKiaBa9V8EUFbxCwO4vAmHR8uMSboF5TUWc10REREQUtXgVTG2y+Yfm6WTfjcIrz6yFVvINgaxyeCPdHCIiIiJqAS+DqU3BoXlaGZIUvXOaYpVWltDdcryKHhERERFFHyZN1KZGT/TPZwKAFEM6LhkwCymGdHVOkJEBzJ3ruw+zpkP0iIiIiCj6sOQ4tanR7RueZ47iynkAkJNUgDsnLFHvBD17Ai++qE5oqw7/g68YhBCCPXpEREREUSa6uw8oooQQsPl7mqxRXgTC6bHjQPUOOD12dU5gtwPbt/vuwyzXrIVOBuxegQrOayIiIiKKOtF9JUwR5fAKeAUgATBFeU/TwZpdmPXumThYs0udE+zcCQwd6rsPM02TeU3FHKJHREREFHWYNFGrApXzzFqJQ8ZUlm9l0kREREQUrTiniVrVEAOL2oZiZwd6jUw7d2KQ/zFqDAC0wwBI2dh/zI6Nx/airRQ1MzMTBQUFKrSCiIiIiFrCpIlaFaycF+XzmTqq6mgZIEmYOXNmux9zGoBNAK6ZORM/qNAmrd6Ae7/aB+gNmHL5L1FVvL/VY81mM3bu3MnEiYiIiKiLMGmiVtn8lfMsuugfmidBgk7WQ2qzj8anobYWEALzH3wMI84Y0674GXt3w7vgJtzz+HOo6ts/1Oa2qAZeeADc99q/YXTUtnjMob278ND8uaisrGTSRERERNRFmDRRi9yKgFPxJ00x0NPUP3MEvri+ukOP6V7YBwOGj2zfwcNH4pvpVyATQGaHW9c+h+rdONzogalbd/RPLVTpLERERETUUdF/NUwR0eifz2TQSNDK0d/TFA9S9L4/xzqXEuGWEBEREVFTTJqoRYHKeZYoLzUecPDYT5j7r7Nx8NhPqsQ37fkJp114Nkx71IkPAEn+ghtORcDhZeJEREREFC2YNFGLGmOscp7T68Ceqi1weh2qxJftDli3bYFsVyc+4FuvyeqfP8beJiIiIqLoERtXxNTl4rVyXrRL1mkAMGkiIiIiiia8IqaTKELE3PC8eMF5TURERETRh0kTncThERAANJKvEAR1nWR/0mT3Cri8IsKtISIiIiKASRO1IDA0z6yVIUmxkTTlJfXE/ZNfRV5ST1XiOwt6Yudzr8JZoE78AK0sBXv36tzsbSIiIiKKBlyniU4SGJpnjqGheUmGNEzsPV21+J7UNFReql78ppL1Mho9XtS5vMg0arrknERERETUOvY00UlsTXqaYkW1rRxv/fhPVNvKVYmvqyhH9+f+CV2FOvGbStb7EqVazmsiIiIiigqxc1VMXaYxBotAVNhKsWT9QlTYSlWJry8tRe/7F0Jfqk78ppL9Zd5tHgG3wnlNRERERJHGpIma8SoCTn8BAnOMrNEUb/QaCSZ/AY569jYRERERRRyviqmZwHwmnQzo5NjpaYo3gSp6HKJHREREFHlMmqgZLmobHQJJU53bG+GWEBERERGvjKmZ40UgYquXyapPxlkFF8OqT1Ylvjc5GVUXXAxvsjrxTxRY5LbBLeDhvCYiIiKiiGLJcWrmeLnx2Mqnuyf3xsNT31YtvqNXb+x4Rb34JzJoZBg0EpxegXq3gjQDS48TERERRUpsXRmT6oI9TTFWBMKjuFFjr4BHcasSX3K7oauqgORWJ35LAlX06jiviYiIiCiiYuvKmFTl8gq4/dfnsTY8b1/1dlz2WiH2VW9XJb5553aMHVYI80514rckMESPSRMRERFRZDFpoqBAL5NRI0EjxVbSFI8CxSDq3QoUwXlNRERERJHCpImCjs9nYsIUDYwaCToZEPAlTkREREQUGUyaKKgxWDmPH4toIEkSUvS+AhAcokdEREQUObw6pqDA8DxLjBWBiGdc5JaIiIgo8lhynAAAQoiYHp7XN30YPp5dAqPWokr8xiHD8M2uEnjN6sRvTaCCHuc1EREREUVOVHUp3HfffZAkqdlt4MCBwf0OhwPz5s1DRkYGrFYrZsyYgfLy8gi2OH44vAKKACQAJk3sJU0aWQOLPhkaWaX1jDQaeJOSAU3Xrpdk1krQSoAigEY3kyYiIiKiSIiqpAkAhgwZgtLS0uDt66+/Du5bsGABVq5ciXfeeQdr1qxBSUkJpk+fHsHWxo+mvUxSDFbOK67di9s+uhzFtXtViW/cvxdDr74cxv3qxG+NJEnBIXp1bm+XnpuIiIiIfKJueJ5Wq0VOTs5J22tra7F06VK8+eabmDRpEgBg2bJlGDRoENavX4+xY8e2GM/pdMLpdAZ/r6urU6fhMc4W40UgbO4GfHf4C9jcDarE1zQ0IG3NF9A0qBO/Lcl6GdVOBXUuJfq+5SAiIiJKAFF3DbZnzx7k5eWhd+/euOaaa1BUVAQA2LhxI9xuNyZPnhw8duDAgSgoKMC6detajbd48WKkpKQEb/n5+ao/h1gUy/OZ4l2y7ngFPQ7QIyIiIup6UZU0jRkzBi+//DI++eQTPPPMMzhw4ADOOecc1NfXo6ysDHq9Hqmpqc0ek52djbKyslZjLly4ELW1tcFbcXGxys8iNsV6T1M8s+gkyBLgEYBXo490c4iIiIgSTlQNz7vooouCPw8fPhxjxoxBz5498fbbb8NkMnUqpsFggMFgCFcT45IQAnb2NEUtWZKQpJNR61Lg1nXu74CIiIiIOi+quxVSU1PRv39/7N27Fzk5OXC5XKipqWl2THl5eYtzoKj9HF4BAd+HwRCDlfMAINvSHX84+zFkW7qrEt/VvTv2/uUxuLqrE/9UAqXHPXpzRM5PRERElMiiOmlqaGjAvn37kJubi9GjR0On0+GLL74I7t+1axeKioowbty4CLYy9gXmM5litHIeAKSasjB9yE1INWWpEt+dkYXS626CO0Od+KcSqKDHniYiIiKirhdVSdPtt9+ONWvW4ODBg/jmm2/w85//HBqNBldffTVSUlIwd+5c3HrrrVi1ahU2btyI6667DuPGjWu1ch61TzzMZ6pzVOO/e5ajzlGtSnztsWpk/Ws5tMfUiX8qSToZEgBFo0NKTmR6u4iIiIgSVVRdJR8+fBhXX301BgwYgCuuuAIZGRlYv349srJ83+4//vjj+NnPfoYZM2bg3HPPRU5ODlasWBHhVse+eKicV9pQhIdWXY/ShiJV4huKizDwluthKFYn/qloZAkWne/9KTyNXxIQERERdaWoKgSxfPnyNvcbjUYsWbIES5Ys6aIWJQa7v6fJFMM9TYkgWadBg9uDXkyaiIiIiLoUr5ITHCvnxY7AvCYmTURERERdi0lTgnN4BRT4PgjGGK2clygCSVN2n4Fw8U+XiIiIqMvwyivBxUPlPAAwac0Y0u1MmLTqlORWzGbUjT4TijlyJb91sgSNxwkAqAHXHiMiIiLqKlE1p4m6nj0OKucBQEFqfzwz7UvV4tv79seWlerFby+d2w6v1oBjTJqIiIiIukxsXylTyJr2NFH007rsAMCkiYiIiKgLMWlKcPGwRhMA7KrcjHOft2JX5WZV4lt+3Ixz8qyw/KhO/PbSuW0AgHro4fKKiLaFiIiIKFHE9pUyhYSV82KPRvGgpvQwhCShxOaOdHOIiIiIEgKTpgQWqJwngZXzYsnBH9YDAA43eCLcEiIiIqLEwKQpgTXtZYrlynmJ5oA/aSpuYE8TERERUVdg0pTAAvOZTDE+nynRHNq8AQBQYnPDKziviYiIiEhtLDmewGxxNJ+pV+pAvHnlFmRZuqsS39Z/IL5buwXOXHXid8TR/bugFV64FQ3KbR7kWXSRbhIRERFRXAupi6G0tDRc7aAIiJfKeQBg0BrRI6UPDFqjKvGF0QhHYR8IozrxO9QWIZAG3yK3HKJHREREpL6Qrpbz8/Nx4YUX4rXXXkNjY2O42kRdoGnlvHhYo6mk7iAe/HIuSuoOqhLfUHQQA+bPhaFInfgdlepPmg43shgEERERkdpCSpoeeOABlJSUYNasWcjOzsbMmTPxySefQFGUcLWPVOJsUjnPFAeV8+pdNfhs71uod9WoEl9bU4NuK96Ctkad+B0V6Gk63OCG4LwmIiIiIlWFlDTddddd2LZtGzZu3Iibb74Zq1evxsUXX4y8vDwsWLAA33//fbjaSWFm9x7vZWLlvNiTDBe0ku99rHJ6I90cIiIiorgWlsksp512Gh599FEUFxfjs88+wyWXXIJly5ZhzJgxGDx4MBYtWoSioqJwnIrCJFAEIh56mRKRDAQLQHC9JiIiIiJ1hbUCgCRJOOecc3DxxRdj7NixEEJgz549uO+++9C7d2/88pe/ZPGIKGFnufGYl2/1Fb9kMQgiIiIidYXtinnVqlW4/vrrkZ2djSuuuAJlZWV49NFHcfjwYZSWluLhhx/GF198gV//+tfhOiWFIJ6KQABAhjkHs0ctRIY5R5X4ruwcHLp1IVzZ6sTvjB7+nqbiRiZNRERERGoKaZ2mLVu24I033sD//d//oaSkBDk5Obj++utx7bXXYtiwYc2Ovf3222E0GnH77beH1GAKD7s3fsqNA0CmOQdzTv+TavHd2Tkoul29+J3R3aKDBKDOpaDO5UWyXhPpJhERERHFpZCSptNOOw0mkwnTpk3DtddeiwsuuACy3PpF+JAhQzBu3LhQTklh4FYE3P4Ch/Eyp6nRVYft5d9iSPaZsOiTwx5fU1+HpI3fon70mfAmhT9+Z+g1ErLNWpTZPChucGNIOpMmIiIiIjWE1M3w0ksvoby8HG+88QamTJnSZsIEABMnTsSqVatCOSWFQWA+k16WoJHjI2k6XLcft388DYfr9qsS33hgP4b9ahqMB9SJ31n5Ft/3HlyviYiIiEg9ISVNs2fPhtVqDVdbqIsE5jOZ42Q+UyLrYfXPa2IxCCIiIiLVhJQ0Pfnkk5gyZUqr+y+66CI888wzoZyCVGCLsyIQiSzfXwyi0uEN9iASERERUXiFlDQtXboUgwcPbnX/4MGD8fzzz4dyClJBoAgEy43HPrNORobBN5fpMKvoEREREakipKvmffv2YdCgQa3uHzhwIPbt2xfKKUgF9jhc2FYv69E9uTf0sl6V+MKgh71XbwiDOvFD0cO/XhMXuSUiIiJSR0jV8/R6PcrKylrdX1paesriENS1FCHg8AbmNMXPe1OYPhj/d9WPqsW3DRiM779RL34oelh02FLl5LwmIiIiIpWEdNU8duxYvPzyy6ivrz9pX21tLZYtW4axY8eGcgoKs0Avk0YCdPGTMyW0fH8xiDKbB25FRLg1RERERPEnpMvme++9FyUlJRg5ciT++c9/4ssvv8SXX36JJ598EqeddhpKS0tx7733hqutFAZ27/EiEJIUP8Pz9lVtw6Wv9sS+qm2qxDfv2IaxQ3vCvEOd+KFI0ctI0slQAJRwXhMRERFR2IU0PG/MmDFYuXIlbrrpJvz+978PXoQLIVBYWIgPPviAi9lGmUCFNbMmvrqZPMKDWkcVPEKdeT2SxwNddRUkT/TNG5IkCT0sWuyscaG4wYOeSdE374qIiIgoloWUNAHABRdcgL179+KHH34IFn3o06cPRo0aFVc9GfHCznLjcSnfqsPOGhcr6BERERGpIOSkCQBkWcbo0aMxevTocIQjFdk8LDcejwKL3B5pdEMRAjK/sCAiIiIKm7AkTTt27MD+/ftx7NgxCHHyRPRrr702HKehEAkhms1poviRZdTAqJHg8AqU2z3INesi3SQiIiKiuBFS0rRv3z7MnDkT3377bYvJEuCbb8GkKTq4FAFFABIAYxyt0QQA+Sl98fTlXyA/pa8q8e19+mLzB1/A3ked+KGSJAndLVrsq3OjuIFJExEREVE4hZQ03XTTTdi6dSueeOIJnHPOOUhLSwtXu0gFgflMRo0Ud8O3zDorhmaPUS2+YrGi/nT14odDvlWHfXVuHG5w48xupkg3h4iIiChuhJQ0rV27FnfddRduueWWcLWHVGSL4yIQRxuO4O2t/8QVw25BN2v3sMfXlxxB9+f/iSM33gJXXvjjh0MPi6936XCjG0IIFmIhIiIiCpOQqgFkZmYiJSUlXG0hlQXLjcdhEYhjjgq8vfUpHHNUqBJfV1mBHs8/BV2lOvHDIdeshVbyJcfVTm+km0NEREQUN0K6er755pvx+uuvw+vlBVosYBGI+KaRJeRafJ3HxQ3Rt54UERERUawKaXhe//794fV6MWLECMyZMwf5+fnQaDQnHTd9+vRQTkNhEiw3HmcL29Jx+RYdihs8KG5wY2SmMdLNISIiIooLISVNV155ZfDn22+/vcVjJEliT1QU8CgCbl/OxJ6mOJZv1QHldi5yS0RERBRGISVNq1atClc7SGWBynl6GdDK8Zc0pRozMG3wDUg1ZqgS35OegZJZN8CTrk78cMmzaCEBqHUpqHN5kaw/ueeXiIiIiDompKRpwoQJ4WoHqczu9Q/Ni8MiEACQbc3HreMfVy2+s0c+9i1WL364GDQysk1alNk9ONzowWAmTUREREQhC8sVtNPpxLp16/Dvf/8blZWV4QhJYRbP5cYBwOGxYVflZjg8NlXiyzYbLD9uhmxTJ3449bD6vgs53MAhekREREThEHLS9OSTTyI3Nxfjx4/H9OnT8eOPPwIAKisrkZmZiZdeeinkRlLoguXG47QIxKGa3bhhxXgcqtmtSnzT3t0YNXU8THvViR9OPay+9ZqKmTQRERERhUVIV9DLli3DH/7wB0ydOhVLly6FECK4LzMzE5MmTcLy5ctDbiSFzh7nPU10XL5/kdsKhxcOf7JMRERERJ0XUtL02GOP4fLLL8ebb76JSy+99KT9o0ePxvbt20M5BYWBIgQcwTWa4rOniY6z6GSkG3xzmQ43cr0mIiIiolCFdAW9d+9eXHTRRa3uT09PR1VVVSinoDBweAUEAFnyVc+j+BeY18QhekREREShC+kSOjU1tc3CDzt27EBOTk6nYj/88MOQJAl/+MMfgtscDgfmzZuHjIwMWK1WzJgxA+Xl5Z2Kn0gCQ/PMGgmSFJ/D82TIMOuSIIentkkLJ5DhsSYBcmxknYEhelyviYiIiCh0IV0BXnzxxXj++edRU1Nz0r7t27fjhRdewGWXXdbhuN999x2ee+45DB8+vNn2BQsWYOXKlXjnnXewZs0alJSUYPr06Z1tfsIIFIGI56F5/TKH45PrStEvc/ipD+6ExqHDsW53KRqHqhM/3PL9xSBKbR64FXGKo4mIiIioLSFdRT/00EPwer0YOnQo7r77bkiShFdeeQUzZ87E6aefjm7duuHPf/5zh2I2NDTgmmuuwQsvvIC0tLTg9traWixduhR///vfMWnSJIwePRrLli3DN998g/Xr14fyNOJevJcbp5Ol6GVYdTIUAZSwt4mIiIgoJCElTXl5edi4cSOmTp2Kt956C0IIvPbaa1i5ciWuvvpqrF+/HpmZmR2KOW/ePFxyySWYPHlys+0bN26E2+1utn3gwIEoKCjAunXrWo3ndDpRV1fX7JZoAgvbmuO4p+ngsZ249p3TcfDYTlXim3fvxKjzTod5tzrxw02SJPSw+NdrYjEIIiIiopBoQw3QrVs3vPjii3jxxRdRUVEBRVGQlZUFuRNzP5YvX45Nmzbhu+++O2lfWVkZ9Ho9UlNTm23Pzs5GWVlZqzEXL16M+++/v8NtiRdCiIQoN+70OnHw2E9wep2qxJccTlh2/wTJoU58NeRbdfipxsVFbomIiIhCFNauh6ysLGRnZ3cqYSouLsbvf/97vPHGGzAajWFr08KFC1FbWxu8FRcXhy12LHApgL/aOIya+E2a6GQ9/MUgjjR6oAjOayIiIiLqrJB6mh544IFTHiNJEu65555THrdx40YcPXoUo0aNCm7zer346quv8NRTT+HTTz+Fy+VCTU1Ns96m8vLyNiv0GQwGGAyGU54/XgWKQBg1EuQ4rZxHLcsyaWDQSHB6BY7avcgxh9yxTERERJSQQrqKuu+++1rdJ0kShBDtTprOP/98bN26tdm26667DgMHDsSdd96J/Px86HQ6fPHFF5gxYwYAYNeuXSgqKsK4ceNCeRpxLVhuPI6H5lHLZP+8pn11bhQ3uJk0EREREXVSSFdRiqK0uO3QoUNYsmQJvvrqK3z88cftipWUlIShQ4c222axWJCRkRHcPnfuXNx6661IT09HcnIybrnlFowbNw5jx44N5WnEtUARiHguNw4AeUm9sOjCt5CX1EuV+I6evbB92Vtw9FQnvlp6WHTBpOmMbqZIN4eIiIgoJoX9SlqWZRQWFuLRRx9Fv379cMstt4Qt9uOPP46f/exnmDFjBs4991zk5ORgxYoVYYsfj4LlxuN8PlOSIRXje12CJEOqKvG9KamonnIJvCnqxFdLYL2mw41uCM5rIiIiIuoUVbsfzj33XHz00Uedfvzq1avxxBNPBH83Go1YsmQJqqur0djYiBUrVrQ5n4maLmwb30lTla0cr//wKKps5arE1x0tR49/PgrdUXXiqyXHrIVG8iXP1U5vpJtDREREFJNUTZq+//77TlXSo/DwKAIu/wjKeF6jCQAqbaV4/rv7UGkrVSW+vqwUhYvvg75Mnfhq0coScv1zmQ43cL0mIiIios4IaU7Tq6++2uL2mpoafPXVV1ixYgWuv/76UE5BIbD7a43rZN/FMyWmfKsOhxs9KG50Y0Rm+Mr5ExERESWKkJKm2bNnt7ovMzMTf/zjH/HnP/85lFNQCIJD8zTx3ctEbcu36rCu3M5FbomIiIg6KaSk6cCBAydtkyQJaWlpSEpKCiU0hQHLjRMAdLdoIQGocSmod3uRpNNEuklEREREMSWkpKlnz57hagep4HgRiPjvaUrSp+C8wmlI0qeoEt+bkoKKn02DN0Wd+GoyaGR0M2lQbvficIMHg9KYNBERERF1BFe7jGM2/5ymeK+cBwB5yYV44ILXVYvv6FmIn55XL77aelh1KLd7UdzgxqA0Q6SbQ0RERBRTQuqCkGUZGo2mQzetlnlaVxBCwOFJnKTJ7XXhaMMRuL0uVeJLLhf0JUcgudSJr7Z8i2+9pmLOayIiIiLqsJAymD//+c94//33sX37dkyZMgUDBgwAAPz000/473//i6FDh2LatGnhaCd1kMMrIADIEmBIgMp5+4/twA0rxuOF6V9jQObIsMc3/7QDo6aOx6ZPvkbj8PDHV1tgkdsKhxd2j5IQQzaJiIiIwiWkpCkvLw9Hjx7Ftm3bgglTwM6dOzFp0iTk5eXhhhtuCKmR1HG2QC+TRoIkxX/SRG2z6GRkGDWocviG6PVP5RA9IiIiovYK6evmv/3tb5g/f/5JCRMADBo0CPPnz8df//rXUE5BnZRIRSCofQr8vU2HOESPiIiIqENCuqI+fPgwdDpdq/t1Oh0OHz4cyimokwIL27LcOAX09CdNRfVMmoiIiIg6IqSkaejQoXj66adx5MiRk/YdPnwYTz/9NIYNGxbKKaiT2NNEJ2o6r8nmViLcGiIiIqLYEdKcpscffxxTpkxB//798fOf/xx9+/YFAOzZswfvv/8+hBB4/fXYLdMcq4QQzeY0JYJ+GcPx+dwqaOXWez5D0Th0OL4+UAXRRs9qtLPoZGQaNah0eFHU6MZAzmsiIiIiapeQkqbx48djw4YNuOeee/Dee+/BbrcDAEwmE6ZMmYL777+fPU0R4FYA/+i8hCg3DgCyJEOvUTEJkGUIQ+wnGQVWnS9pqmfSRERERNReIY/dGjp0KN577z3U19ejtLQUpaWlqK+vx4oVK5gwRUhgaJ5RI0FOkMp5xTV78LuVU1Fcs0eV+KZ9ezBsxlSY9qkTv6v0TPLPa2IxCCIiIqJ2C9tKs7Isw2g0wmq1QpY5jyaSbN7EWdQ2wOZpxObSr2HzNKoSX25sROq6ryE3qhO/qwQq6FU6vGh0K7Do+LdKREREdCohXzF9//33mDp1KsxmMzIyMrBmzRoAQGVlJS6//HKsXr061FNQBwWLQGh4QUzNmbQysowaAOxtIiIiImqvkK6qv/nmG4wfPx579uzBzJkzoSjHK3JlZmaitrYWzz33XMiNpI6xexKvp4naj0P0iIiIiDompKTprrvuwqBBg7Bjxw4sWrTopP0TJ07Ehg0bQjkFdUIgaeIaTdSS4CK3XK+JiIiIqF1CSpq+++47XHfddTAYDJBaKDjQvXt3lJWVhXIK6iCvIuBUAj1NiTM8L9vaA3ec+xSyrT1Uie/s3gO7//YUnN3Vid+VAklTtdOLBq7XRERERHRKIV1V63S6ZkPyTnTkyBFYrdZQTkEdZPcXgdBKgE5OnJ6mVGMmfjZwNlKNmarE92Rkovya2fBkqBO/Kxm1MrJN/nlN7G0iIiIiOqWQkqaxY8fi3XffbXFfY2Mjli1bhgkTJoRyCuqgQBEIcwL1MgFAjaMS//npZdQ4KlWJr62qRPYbL0NbpU78rhYcotfginBLiIiIiKJfSFfW999/P77//ntccskl+PjjjwEAW7ZswYsvvojRo0ejoqIC99xzT1gaSu1jS9AiEOUNh/HXr+ajvOGwKvENRw6j//+bD8MRdeJ3tZ5JegAsBkFERETUHiElTWPGjMFHH32EvXv34tprrwUA3Hbbbbjxxhvh9Xrx0UcfYfjw4WFpKLWPPQHXaKKO62HVQgJwzKmgzuWNdHOIiIiIolqnF7cVQqC+vh5nnXUWdu3ahc2bN2PPnj1QFAV9+vTB6NGjWywOQeoKrtGUYMPzqGOMGhnZZi3KbB4UNbgxNF0T6SYRERERRa1OJ00ulwvp6elYtGgR7rjjDowcORIjR44MY9Ooo4QQx8uNa5iwUtt6WnW+pKnejaHpxkg3h4iIiChqdbo7wmAwICcnBwaDIZztoRA4vAICvjfVkGBJk1lrwcjc8TBrLarEVywW1IwbD8WiTvxIOF4MgvOaiIiIiNoS0hiu2bNn49VXX4XLxQpc0SDQy2TUSgk3NDI/tR+evPQT5Kf2UyW+vU8/bP3XJ7D3USd+JATmNdW6FNRyXhMRERFRqzo9PA8Ahg0bhvfffx9DhgzB7Nmz0atXL5hMppOOmz59eiinoXayexOz3DgAKEKBR3FDK+sgSyo8f0WB5HZD6HSAHB+vr0EjI9esRYl/iN6wDM5rIiIiImpJSEnT1VdfHfy5tdLikiTB6+W32F0hWG48wYbmAcCeqh9xw4rxeGH61xiQOTLs8S3bfsSoqeOx6ZOv0Tg8/PEjpcCqQ4nNg0MNbgzL4LwmIiIiopZ0OGm66667cNVVV2H48OFYtWqVGm2iTrIn6BpN1HkFSTqsP2rnek1EREREbehw0vTwww9j6NChGD58OCZMmICqqip069YNn332GSZNmqRGG6mdWG6cOqqHRQcZQJ1LQY3Ti1QDh+gRERERnSgsV9dCiHCEoRC4FQF/RxN7mqjd9BoJuRbfdyesokdERETUMnZJxAmbv5fJoJGgSbDKeRSaQOnxonomTUREREQtYdIUJ+wJXAQCAHqnDca7v9qF3mmDVYlvGzgYG77fBdtAdeJHUs9A0tTgZq8xERERUQs6VT3v4MGD2LRpEwCgtrYWALBnzx6kpqa2ePyoUaM61zpqt0QvAqHT6NHN2l21+EKvhytPvfiR1N2qg0YC6t0KjjkVpBs5r4mIiIioqU4lTffcc89JJcZ/+9vfnnScEIIlx7tIIq/RBAAldQfw7IZ7cPOYB5GXXBj2+MZDB9DrL/fg4J8ehKNn+ONHkk6W0N2iQ1GDGwfrXUg3nrzWGhEREVEi63DStGzZMjXaQSGyJXhPU72rFqsPvI9rTrtdlfia2lpk/ed9FM9XJ36k9UoKJE1ujMpi0kRERETUVIeTplmzZqnRDgqBVwg4vYE5TYnZ00Sh6ZmkA0p9FfQUISCzmAgRERFREK+w44DD38uklQAd31HqhFyzFgZZgtMrUG7zRLo5RERERFGFl9hxoOmithJ7CKgTZElCQZKvit5Blh4nIiIiaoZJUxyweRN7PhMAZJpzceMZ9yHTnKtKfFdOLg4svA+uHHXiR4NeTJqIiIiIWtSp6nkUXRK93DgAZJizMVOlIhAA4O6WjcO3xGcRiIBA0nS40Q23IqCTE/fzRERERNQUe5riQGB4njmBi0DUO2vw9cEPUe+sUSW+prYG6Z9+CE2tOvGjQbpBA6tOhlcARxrY20REREQUkLhX2XFCCMGeJgAl9Qdx13+vREn9QVXiGw8dxJDrroTxkDrxo4EkSceH6DFpIiIiIgpi0hTjnF4BBYAEwKhJ3KSJwoPzmoiIiIhOxqQpxtmbFIFg5TwKVU9/0lRm8wSHfRIREREluqhKmp555hkMHz4cycnJSE5Oxrhx4/Dxxx8H9zscDsybNw8ZGRmwWq2YMWMGysvLI9jiyLM1KTdOFKoknQaZRg0A30K3RERERBRlSVOPHj3w8MMPY+PGjfj+++8xadIkXH755di+fTsAYMGCBVi5ciXeeecdrFmzBiUlJZg+fXqEWx1ZNv98JnOCD80zaAzolTYQBo1BlfjCaEBj/4EQRnXiR5NAb9PBOiZNRERERECUlRy/9NJLm/3+l7/8Bc888wzWr1+PHj16YOnSpXjzzTcxadIkAMCyZcswaNAgrF+/HmPHjo1EkyMuUATCnMBFIACgV9ogvPrL71WLb+s/CJtWqxc/mhQm6bGxwoGD9a5IN4WIiIgoKkRVT1NTXq8Xy5cvR2NjI8aNG4eNGzfC7XZj8uTJwWMGDhyIgoICrFu3rtU4TqcTdXV1zW7xQgjB4XkUdgVWHWQJqHEpOOb0Rro5RERERBEXdVfaW7duhdVqhcFgwM0334z33nsPgwcPRllZGfR6PVJTU5sdn52djbKyslbjLV68GCkpKcFbfn6+ys+g67gVwF8HIqHLjQPAnsofMXVZLvZU/qhKfMu2HzGufy4s29SJH030GgndLb5O6AN17G0iIiIiirqkacCAAdi8eTM2bNiA3/zmN5g1axZ27NjR6XgLFy5EbW1t8FZcXBzG1kZWoJfJqJEgJ3jlPAUKbO56KFCp4puiQNtQDyiJUVGuMEkPADjA0uNERERE0TWnCQD0ej369u0LABg9ejS+++47/OMf/8CVV14Jl8uFmpqaZr1N5eXlyMnJaTWewWCAwRCfk/c5n4nU0jtZj69KbThU74ZXCGgSPCknIiKixBZ1PU0nUhQFTqcTo0ePhk6nwxdffBHct2vXLhQVFWHcuHERbGHkBHqazJzPRGGWbdLApJHgUgRKGj2Rbg4RERFRREVVT9PChQtx0UUXoaCgAPX19XjzzTexevVqfPrpp0hJScHcuXNx6623Ij09HcnJybjlllswbty4hK2cFyg3nujzmSj8JElCryQddta4cKDOhXyrLtJNIiIiIoqYqEqajh49imuvvRalpaVISUnB8OHD8emnn+KCCy4AADz++OOQZRkzZsyA0+nElClT8PTTT0e41ZFj97KnKaBnan+8MP1r9Eztr0p8e9/+2PTJ17D3VSd+NCpM1vuSpno3zo10Y4iIiIgiKKqSpqVLl7a532g0YsmSJViyZEkXtSh6uRUBt78mgSnBF7YFAKPWjAGZI1WLr5jNaByuXvxo1Mu/yG2pzQO7R2FZeyIiIkpYvAqKUYH5TAZZgkZm0lTeUIy/f70A5Q3qVEc0HC5Gn4ULYDgcP9UXTyVZr0GmUQMAOMQqekRERJTAmDTFKFbOa67GUYX3d7yAGkeVKvG11VXIe+UFaKvViR+tCv29TfvruV4TERERJS4mTTEq0NPEIVOkpsJk33pNB+vcEEJEuDVEREREkcEr7hjFnibqCvlWHTQSUOdWUOX0Rro5RERERBHBpClGHe9pYtJE6tHJUrDc+P46zmsiIiKixMSkKQZ5FAGXv3Iey437pBmzcMWw+UgzZqkS352ZhcM3zoc7U5340ay3f4je/jrOayIiIqLEFFUlx6l9AkPzdDKgZeU8AEA3a3fMH/ewavFded1x4D714kezPsk6fHkEKG5ww+UV0LPEPRERESUYdlPEoMDQPPYyHWdzN2Bb+QbY3A2qxJcbG5D0/QbIjerEj2bpBg1S9DK8AjjUwN4mIiIiSjy86o5Bdi+LQJyouHYvfvvv81Fcu1eV+KZ9ezHysvNh2qdO/GgmSVKTIXqc10RERESJh0lTDGK5cepqvZMDxSBcLD1ORERECYdX3THIxnLj1MV6WvXQSECtS0E1S48TERFRgmHSFGM8ioAzODyPbx91Db1GQg+Lr7dpH4foERERUYLhVXeMaVo5T8fKeUFaSYsUYwa0kjoFIYVWC3d6BoQ2cQtONh2iR0RERJRIEvcKMEaxcl7L+mQMxcprD6kW3zZ4KNZvUy9+LOiTrMeqEhtLjxMREVHC4ZV3jDmeNPGClbpWhlGDZJ2v9HhRA4foERERUeJg0hRjAkUgLOxpauZA9Q5cvXw4DlTvUCW+edcOnH7WcJh3qRM/FjQvPc4hekRERJQ4eOUdYxo5PK9FLsWFI3X74VLUuZiXnC6YDu6H5EzsZKFPim9e016WHiciIqIEwivvGOJWBNy+nAkmDs+jCAiUHq9zKah0sPQ4ERERJQYmTTEkMJ/JoJGgZeU8igC9RkLPpEDp8cTudSMiIqLEwaQphnBRW4oGff3zmvbWMmkiIiKixMCkKYaw3HjreiT3xqMXvY8eyb1Vie8o7I2tb74PR6E68WNJnxRf0nSk0QO7/zNJREREFM+4TlMMsbnZ09Qaiz4ZZ+ZPVi2+NykZNeepF7+jdu7cGdHzW5GDBkmPL3/cjVzY2v24zMxMFBQUqNgyIiIiovBj0hQjhBDsaWpDpa0MH+xYissGz0WmOSfs8XXlZch9bSlKfz0X7uzwx2+vqqNlgCRh5syZEWsDAFw4/0+YOOcPeP3Tr7D8rpva/Tiz2YydO3cycSIiIqKYwqQpRrgVwD+liT1NLaiyleHlTYtxdq9LVEma9OVl6Pn3xai68JKIJk0NtbWAEJj/4GMYccaYiLXDrTWiFsDICy/HpFFD0J5P5KG9u/DQ/LmorKxk0kREREQxhUlTjAj0Mhk1EmSJSVOi617YBwOGj4zY+YUQ+PaoAx5Zg9yBw5Ci10SsLURERERq4zivGBGonGdhLxNFAUmSkGbwJUrVDhaDICIiovjGpClGNHI+E0WZdIPvs3jMyUVuiYiIKL7xCjxGBItA6PiWtSRJn4oL+l6JJH2qKvE9qak4Ov1KeFLViR+LUg0aSADsXsHS40RERBTXOKcpBvgq57HceFvyknvhnklLVYvvLOiFXU+pFz8WaWUJyXoZtS4F1U4vurMXlIiIiOIUr3JigNMroAhAgq8QBJ3M6XHgcO0+OD0OVeJLDgeMB/ZBcqgTP1alc14TERERJQAmTTEg0Mtk0rJyXmsO1vyEX701AgdrflIlvnn3Tzjj7BEw71YnfqxKN/r+CalzK3ArIsKtISIiIlIHk6YYECgCYeHwJ4oyRo0crOhY7WBBCCIiIopPvAqPAY2B+Uw69jJR9Ek3+ofosYoeERERxSkmTTGg0c2eJopegXlNNU4FXsEhekRERBR/eBUe5byKgMMbWNiWbxdFH4tWgkGWoMCXOBERERHFG5Ycj3KBIhA6GdCzcl6rBmSOxFc3NqgWv3H4SPyvRL34sUySJKQbZZTavKh2epHhH65HREREFC/YdRHlWASCYkFgiN4xpxeCQ/SIiIgozvBKPMoFkyYd36q2FNXsxm/en4Simt2qxDft3Y0Rl06Caa868WNdsl6GVgLcClDv5hA9IiIiii+8Eo9yjW5/5Twth+a1xe6xYfvRb2H32FSJL9tsSN74LWSbOvFjnSxJSPP3NlVxoVsiIiKKM0yaopgQAjYOz6MY0bT0OIfoERERUTzhlXgUc3oFvAKQAJjY00RRLk0vQwbg8Irg2mJERERE8YBJUxQLLmqrlSBLTJooumlkCWkG3z8pVQ4udEtERETxg0lTFOOitu2Xay3A3RNfRK61QJX4zvwC/PTPF+HMVyd+vAiUG690cIgeERERxQ+u0xTFApXzzKycd0rJxnRc2O8q1eJ70tJRMUO9+PEizaCBBDccXgGbR8CiYw8pERERxT5ejUexwPA8C+cznVKNvQIrtj+HGnuFKvF1VRXIXfYcdFXqxI8X2qZD9JwcokdERETxgUlTlPIoAk6vP2liT9MplTcewRNrb0N54xFV4uuPHEHfP90G/RF14seTwBA9zmsiIiKieMGr8SgVKDWulwGdzJ4mih3pBg0kADbP8ZL5RERERLEsqpKmxYsX44wzzkBSUhK6deuGadOmYdeuXc2OcTgcmDdvHjIyMmC1WjFjxgyUl5dHqMXqCQ7NYy8TxRitLCFFzyp6REREFD+i6op8zZo1mDdvHtavX4/PPvsMbrcbF154IRobG4PHLFiwACtXrsQ777yDNWvWoKSkBNOnT49gq9XBynkUyzI5RI+IiIjiSFRVz/vkk0+a/f7yyy+jW7du2LhxI84991zU1tZi6dKlePPNNzFp0iQAwLJlyzBo0CCsX78eY8eOjUSzVRGsnMciEO1i1llxRo/zYdZZVYnvtVpxbML58FrViR9v0o0aoM6NRo+Aw6PAyOSfiIiIYlhUJU0nqq2tBQCkp6cDADZu3Ai3243JkycHjxk4cCAKCgqwbt26FpMmp9MJp9MZ/L2urk7lVodOCAGb2zc8z8rhee2Sn9IXj138b9XiO3r3xbb/Uy9+vNH5h+jVuhRUOrzoYeXnmIiIiGJX1F7JKIqCP/zhDzj77LMxdOhQAEBZWRn0ej1SU1ObHZudnY2ysrIW4yxevBgpKSnBW35+vtpND5nNI6AA0EiAUcOepvbwKl40uurgVVQaDub1QlNfB3g53Ky9svxD9Co4RI+IiIhiXNQmTfPmzcO2bduwfPnykOIsXLgQtbW1wVtxcXGYWqiehibzmSSJSVN77K3eiotezsPe6q2qxLds34qzBuTBsl2d+PEow9ikip6bVfSIiIgodkXl8Lz58+fjP//5D7766iv06NEjuD0nJwculws1NTXNepvKy8uRk5PTYiyDwQCDwaB2k8OqwT+fiUPzKJZpZQmpBhnHnAp7m4iIiCimRdVVuRAC8+fPx3vvvYcvv/wShYWFzfaPHj0aOp0OX3zxRXDbrl27UFRUhHHjxnV1c1UTqJxn1bGXiWJbYIhepcMLEeG2EBEREXVWVPU0zZs3D2+++Sb+/e9/IykpKThPKSUlBSaTCSkpKZg7dy5uvfVWpKenIzk5GbfccgvGjRsXN5XzhBBodHONJooP6QYNZMkNh1fAoI2tHl8iIiKigKhKmp555hkAwHnnndds+7JlyzB79mwAwOOPPw5ZljFjxgw4nU5MmTIFTz/9dBe3VD1Ni0CYWASCYpxGlpBu0KDS4YXTmBzp5hARERF1SlQlTUKcegCP0WjEkiVLsGTJki5oUddjEYjO6ZM+BB/8+gCshlRV4tsGDcH6rQfgSVYnfjzLNPqSJpchiZ9pIiIiiklRlTQRi0B0llbWIdWUpVp8odPBnaFe/HiWZpChkQCvRoeep8XHMFoiIiJKLLwyjzIsAtE5R+r244+fXIEjdftViW88uB+DZ10B40F14sczWZKQ4S8IMWLKzyPcGiIiIqKOY9IURVgEovMaXHX4pugjNLjqVImvqatDxmcfQVOnTvx4F6iiN/yCy8EVm4iIiCjWcHheFGERCIpXKXoZstcNc2o6KgTXbCIiIqLYwu6MKMIiEBSvJEmCweHrpSuBJcKtISIiIuoYJk1RhEUgKJ4FkqZKmGBzc5AeERERxQ5enUcRFoHovCxzLuaNXYwsc64q8V25udh/72K4ctWJnwi0XhcO79gMIUnYccwZ6eYQERERtRuTpijBIhChSTdn48rhtyDdnK1KfHdWNo7cdAvcWerETxSbVr4FANhWzaSJiIiIYgevzqMEi0CEpt55DKv2r0C985gq8bU1x5C5cgW0NerETxRbPl0BSQiU2T2osHsi3RwiIiKidmHSFCVYBCI0JfWHcO/n16Kk/pAq8Q1FhzDopmthKFInfqKw1VQjE3YA7G0iIiKi2MGkKUrU+5OmJD3fEopveWgEAGyvdkIRIsKtISIiIjo1XqFHiWDSxPlMFOeyYIdRI6HBo+BAnTvSzSEiIiI6JV6hRwFFkmHz+L5xZ9JE8U4GMCTdAADYUuWIbGOIiIiI2oFX6FHAozUCAAwaCXoWgegUg8aIfhkjYNAYVYmvmIxoGDoCikmd+IlmZIbvddxT6wrO5yMiIiKKVtpIN4AAj84EgL1MoeiVNhBLZ6xVLb6930D88F/14ieaLJMW3S1aHGn04McqB87KMUe6SURERESt4lV6FHDrfN+6M2miRBLobdpS5YBgQQgiIiKKYrxKjzBJko73NLFyXqftrtyC819Mx+7KLarEt2zdgrN7pcOyVZ34iWhgmgEGjYRal4ID9SwIQURERNGLV+kRltmzD4SsgQzAouV8ps4SEHArLgio1GMhBGSXC2CPSNjoZAlD/QUhNleyIAQRERFFLyZNEVYw/AwAgFUnQ+aitpRgWBCCiIiIYgGTpggrGH46AA7No8SUZdKih0ULAeBHlh8nIiKiKMUr9QgrGOZPmlgEghLUCH9v0+ZKBxQOfyQiIqIoxCv1CPJAQrc+AwEwaQpVr9QBeOUX36JX6gBV4tv7DcDGVd/C3k+d+IlsYJoBJo2EOreCPbWuSDeHiIiI6CS8Uo+gWughyzJkr4uL2obIoDWhMH0wDFqTKvEVkwm2AYOhmNSJn8h0soTTMn29Td8dtUe4NUREREQnY9IUQTXwVQ7TuTmXI1Rl9UV4ZM08lNUXqRLfcLgI/W6bB8NhdeInutOyjJABHG70oMzmiXRziIiIiJph0hRBtf6kSevmt+uhqnVW48Ndr6DWWa1KfG11NXL+7xVoq9WJn+iSdBoMSvP9PbC3iYiIiKINk6YIEUKgBnoAgJY9TUQ4vZtviN7OGifLjxMREVFUYdIUIV4BFKIO2774D7QeJk1EuWYdeli0UATwQyV7m4iIiCh6MGmKEK0soRD1eOP/XQeWgCDyOT3LV2jjh0oHPArLjxMREVF0YNJEcSHd1A3XjLwN6aZuqsR3Z3VD8fzb4M5SJz759E/VI1knw+YR2H7MGenmEBEREQFg0kRxIsuSh5vOvB9ZljxV4rty83DwrvvhylUnPvnIkoTTu/l6m9aX27jYLREREUUFJk0UF2yuevxQ8hVsrnpV4msa6pHyzVfQNKgTn44bmWGESSPhmFPBT8e42C0RERFFHpMmigvFdfvw+/9cjOK6farEN+7fh+G/uBjG/erEp+P0Ggln+Hubvim3QbC3iYiIiCKMSRMRRZ1RWUYYNBIqHV7srmVvExEREUUWkyYiijpGjYzRmb51m9aV2dnbRERERBHFpImIotLp3UzQyUCZ3YMD9e5IN4eIiIgSGJMmigtaWYssSx60slaV+EKnhTM3D0KnTnw6mVkrY2SGr7dpbRnnNhEREVHk8AqQ4kKf9KH41zW7VYtvGzQU325ULz61bEy2GT9UOnCk0YN9dW70TdFHuklERESUgNjTRERRy6qTMTrLV0lvdUkj120iIiKiiGDSRHFhX/U2zHijP/ZVb1MlvnnnNpw5uj/MO9WJT60bl22C0V9Jb1u1M9LNISIiogTEpInigkfxoKKxBB7Fo0p8ye2BobQEklud+NQ6o1bGuGxfb9P/Sm1wK+xtIiIioq7FpImIot7oLBOSdTLq3Qo2Vdgj3RwiIiJKMEyaiCjqaWUJ43PNAIBvyu1weJQIt4iIiIgSCZMmIooJQ9MNyDJq4PQKfF1mi3RziIiIKIEwaaK4kJ/cB//42UfIT+6jSnxH7z748d2P4OitTnw6NVmSMKm7BQCwscKBchvnlxEREVHXYNJEccGsT8JpeefCrE9SJb7XmoTas86F16pOfGqfwmQ9BqbqIQB8WtzABW+JiIioSzBporhQ0ViC5769FxWNJarE15eWoNeie6EvVSc+td/53S3QyxJKbB5sqWIJciIiIlIfkyaKC9X2o3hj82Ooth9VJb6u4ijyn3oMugp14lP7Jek1OMdfFGJ1SSNsbhaFICIiInVFVdL01Vdf4dJLL0VeXh4kScL777/fbL8QAn/+85+Rm5sLk8mEyZMnY8+ePZFpLBFFzOgsI7qZNHB4BVaVNEa6OURERBTnoippamxsxIgRI7BkyZIW9//1r3/Fk08+iWeffRYbNmyAxWLBlClT4HA4urilRBRJsiRhSr4VALC12on9da4It4iIiIjimTbSDWjqoosuwkUXXdTiPiEEnnjiCdx99924/PLLAQCvvvoqsrOz8f777+Oqq67qyqYSUYR1t+gwOsuIjRUOfHioHnMHpcGsjarvgYiIiChOxMwVxoEDB1BWVobJkycHt6WkpGDMmDFYt25dq49zOp2oq6trdqP4k2JIxyUDZiHFkK5KfE96OsqungVPujrxqXPOy7Mg06hBo0fgkyJW0yMiIiJ1xEzSVFZWBgDIzs5utj07Ozu4ryWLFy9GSkpK8Jafn69qOykycpIKcOeEJchJKlAlvrNHAfY8tgTOHurEp87RyRJ+1jMJsgTsrnVhazWr6REREVH4xUzS1FkLFy5EbW1t8FZcXBzpJpEKnB47DlTvgNNjVyW+bLfDvGsHZLs68anzcsxanJPjq6b3+eFG1Di9EW4RERERxZuYSZpycnIAAOXl5c22l5eXB/e1xGAwIDk5udmN4s/Bml2Y9e6ZOFizS5X4pj27MHrimTDtUSc+hWZMtgk9LFq4FIH3DtTBrXCYHhEREYVPzCRNhYWFyMnJwRdffBHcVldXhw0bNmDcuHERbBkRRZosSbi0VxJMWgnldi8+5vwmIiIiCqOoqp7X0NCAvXv3Bn8/cOAANm/ejPT0dBQUFOAPf/gDHnroIfTr1w+FhYW45557kJeXh2nTpkWu0UQUFVL0Gvy8VzKW763FjmNOZJs0GJNtjnSziIiIKA5EVdL0/fffY+LEicHfb731VgDArFmz8PLLL+OOO+5AY2MjbrzxRtTU1GD8+PH45JNPYDQaI9VkIooiBUk6nN/Dgs8ON2J1iQ1ZJi16J+sj3SwiIiKKcVGVNJ133nltDqmRJAkPPPAAHnjggS5sFcUCCRJ0sh4SJJVOIEHR6wFJpfgUNqMyjSi3efBjtRP/PliPmf1SkGWKqn/qiIiIKMbwSoLiQv/MEfji+mrV4jcOG4G1B9WLT+EjSRIuzLeiyunFkUYPlu+txcz+qUgzaCLdNCIiIopRMVMIgoiovbSyhF/2TkaWf+Hb5XtrUediKXIiIiLqHCZNFBcOHvsJc/91Ng4e+0mV+KY9P+G0C8+GaY868Sn8jFoZV/ZNQZpBRq1LwVt762BzK5FuFhEREcUgJk0UF5xeB/ZUbYHT61Alvmx3wLptC2S7OvFJHVadjKv6piBJJ6PK6cWbe2tRzx4nIiIi6iAmTUQU11L0GlzVNxlWnYxKhxev7a5FlcMT6WYRERFRDGHSRERxL8Ooxcx+vqF6dW4Fr++pRanNHelmERERUYxg0kRECSHVoMHMfqnINmlg9wi8uacWu2qckW4WERERxQAmTRQX8pJ64v7JryIvqacq8Z0FPbHzuVfhLFAnPnUNi07Gr/qloKdVB7cCvHegHqtLGqG0sT4cEREREZMmigtJhjRM7D0dSYY0VeJ7UtNQeel0eFLViU9dx6CRcWXfZJyRZQQArC+34+19dbB7WFmPiIiIWsakieJCta0cb/34T1TbylWJr6soR/fn/gldhTrxqWvJkoTze1hxWa8k6GTgYL0bS3+qwf46V6SbRkRERFGISRPFhQpbKZasX4gKW6kq8fWlpeh9/0LoS9WJT5ExOM2AX/dPRbpBgwa3grf31eHT4ga4vByuR0RERMcxaSKihNbNpMV1A1Mx2j9c74dKB1766RgOsteJiIiI/Jg0EVHC08kSLuhhxVV9k5Gkk1HjUrB8Xx3+faAO9W4uhktERJTomDQREfn1StJj7iBfr5MEYGeNCy/sqMGGchs8CofsERERJSomTRQXrPpknFVwMaz6ZFXie5OTUXXBxfAmqxOfoodRI+OCHlbMGpCKXLMWLkVgVYkNz+88hm3VDgiWJyciIko42kg3gCgcuif3xsNT31YtvqNXb+x4Rb34iWTnzp2RbkK7DQWQBgv2IQV1Li3+c6gB3x6147w8CwqTdJAkKdJNJCIioi7ApInigkdxo8FZA6shFVpZF/b4ktsNbV0NPMmpELrwx08EVUfLAEnCzJkzI92UDtMZTTjv2nmY8ps7cNTuxdv76tDTqsPE7hbkmPnPKBERUbzj//YUF/ZVb8cNK8bjhelfY0DmyLDHN+/cjlFTx2PTJ1+jcXj44yeChtpaQAjMf/AxjDhjTKSb0yGH9u7CQ/Pn4oGbrkFDt77YVOnAoQY3Xt5Vg4GpepyTa0aGkf+cEhERxSv+L09EXap7YR8MiNHEUw8Fk3tYcXqWCf8rtWH7MSd+qnFhV40LQ9MNODvHjFSDJtLNJCIiojBj0kRE1EGpBg0u7ZWEM7v5kqe9dS5srXZie7UTIzKNOCvbhCQ9kyciIqJ4waSJiKiTss1a/KJPMkoa3fiq1IaD9W78UOnAj1UOjMo0Ymy2GRYdi5QSERHFOiZNRETt1Fblv/4AMmHAXqSgBkZ8V+HApqM2FKAevVAHHSJXqjwzMxMFBQUROz8REVGsY9JEcaFv+jB8PLsERq1FlfiNQ4bhm10l8JrViU/RraOV//qNm4gLf7sQPYachgNIwY564H+vPo21//ccXLZGlVt7MrPZjJ07dzJxIiIi6iQmTRQXNLIGFpUWtvWdQANvEhe2TVSdqfwnALhqjsBmzYQpKQUXzluIKb/5fzA1VsNkr4HURT1Pgcp/lZWVTJqIiIg6iUkTxYXi2r14Yu1t+MPZjyE/pW/Y4xv370XfP92GvX95DI7e4Y9PsaEzlf+EEKh0eFHU4IEDWtiSusGd0g35Fh2yzRrIXCCXiIgo6jFporhgczfgu8NfwOZuUCW+pqEBaWu+gKZBnfgUvyRJQpZJi0yjBkftXhQ3eOBUBPbXu1Fi86Bnkg4ZBhkSkyciIqKoxaSJiKgLSJKEbLMWWSYNyu1eFDe44fAK7KpxwaqT0CtJhxSWKSciIopKTJqIiLqQLEnINWuRZdSgpNGDIzYPGtwC26pdSDPI6JWkg1nLMuVERETRhEkTEVEEaGUJBUk65Ji1KG5wo8zuxTGngmNOJ7JNGuRbdTBoOGSPiIgoGjBporiQbemOP5z9GLIt3VWJ7+reHXv/8hhc3dWJT4lLr5HQJ0WPXIuCQ/VuVDsVlNu9qLB7kWfRortFC63M5ImIiCiSmDRRXEg1ZWH6kJtUi+/OyELpderFJzJrZQxKM6DO5cXBeg/q3QoON3pQZvMg36pDDivtERERRQwHzlNcqHNU4797lqPOUa1KfO2xamT9azm0x9SJTxSQrNdgWLoeA1P1MGkkeARwoN6NHyqdqLB7IETXrO9EREREx7GnieJCaUMRHlp1PV6Y/jWSjelhj28oLsLAW67Hpk++hict/PGJmpIkCRlGDdINMsrtXhT5K+3trvWVKe9l1SHFkBiV9oqKilBZWRnpZnRKZmYmFxQmIooTTJqIiKKUJEnI8VfaO2Lz4Eijv9LeMV+lvZ5WHSy6+B0wUFRUhEGDBsFms0W6KZ1iNpuxc+dOJk5ERHGASRMRUZTTyBIKrDrkmLQobnSj3Ha80l6WUYMeVm1climvrKyEzWbD3U8tRc++AyLdnA45tHcXHpo/F5WVlUyaiIjiAJMmIqIYoddI6JOsR57ZV2mvyqmgwuFFhcOLTKMG+XGaPPXsOwADho+MdDOIiCiBMWmiuGDSmjGk25kwac2qxFfMZtSNPhOKWZ34RB1h0soYmGbwVdhr8JUpr3R4UenwIs0go7tZi2S9DInV9oiIiMKCSRPFhYLU/nhm2peqxbf37Y8tK9WLT9QZSTpfmfIGf/JU5VT8w/ZcsGgl5Jq1EGDiREREFComTUREMc6q8/U82T0KSho9OGr3otEjsLfODSmzDy7/4yOogw5CCPY+ERERdUL8DX6nhLSrcjPOfd6KXZWbVYlv+XEzzsmzwvKjOvGJwsGkldEnRY/TuxnR06qFQSNByBqMvWIO1ku5eH7nMawpaUSZjes9ERERdQR7moiI4oxOltDDqkN3ixbbftqD/234DqdN+TmOORWsK7djXbkdSToZvZJ06Om/Jekis+6TEAJ2j0CDR0GD23ezexQ4vQLFSMOVDz2D2pTu+LHKAY8CKAIQEBAAhIDv3v+zBECWAjfp+M+QoJF9r4tWkqAL/Cwf/1mvkaBhLxwREbWCSRMRUZySJAl6tw3L77oJC6acAWuvwdhV48S+Whfq3Qq2VjuxtdoJwDc/KtukRbZZg0yjFql6GSl6DUxaqcND+oQQcHoFbB4Bu1eBzaPA5m6eGDW4FTS6FTR4FCitdXpJSRh58S/gBuB2n7pnTMCXVEEEfmu659S0kq9CoUEjQS8fvzdqJRj9P3N4IxFRYmLSRESUALQQGJxmwOA0A9yKwOEGNw7Wu3Go3o0yuwf1bgX1bhf21jV/nE4GTBoZBo0vedDJEiT4EjIJgFcIeBTAowi4FAG7R4HNI9qZphxn0kqwamVYdTLMWt/5airK8c+/P4orb/gtehT0hFYC5MD5AUgSmv0sBKDAlzgpQvjvfT97hK+Nbn9b3ULArfja7lJ8x3oE4PH4kr2WSIDvdQjctBIMGjn4u1ZmQkVEFK+YNBERJRidLKEwWY/CZD0AwOlVcNTuRbndg3KbB8ecXtS4fL1BbgVwKwrg7vh59LIEs1aCSSvDrJVg1cmw6ORgchS4WbQyNC0kHJsqduPrN57FrF/PRIZRveGDQgh4BeDyCjgV0fzeK+Dw3wsADv/vLdFK/qRKK8NmycQZ03+NKhhQ4/QiWS9DZi8VEVHMYtJEcaFX6kC8eeUWZFm6qxLf1n8gvlu7Bc5cdeITRZJBIyPfKiPfqmu23aMI1LsVODxKMFlwK03nEwloJF8PS2Bom1krw6SVYNLIMdPzIkm+9mtlCa2txCaEL5FyekTwtfDdfPOv3MrxnqpGjxewZGD63X/HRgAbdxyDBCBFLyPVoEGqXoNUg+y/1yBVL8MYZYsSFxUVobKyMtLN6JTMzEwUFBREuhkJh5+ZyODr3nWYNFFcMGiN6JHSR7X4wmiEo1C9+ETRSCtLSDNoAENkikREE0kKDMsDUlrY71WOJ1JOr0Bp+VFs3vgdRo+fCIesg1cANS4FNS4FLXXbGTVSMJlK1muQpJORrJf99xpYOjG3rLOKioowaNAg2Gy2sMSTZBl6swVGSxIMliQYzBZo9AZodXpodHpo9frgz7JWByEUCMV/8/+sKAqE1wu3ww6nvREueyPcdhtcdhucNt/viscDADCbzdi5c2dMXYzFutY+MxqtDgZrEgxmq++9t1ih1esha7TQaLWQNVrIWh00Gg1krRZCUeBxu+F1u6B4PPC4XfB63FA8brjsNjga6uBoqIezsR5CUcLW/lj9zIT7bzVUkiz73mtrkv/v3QqNTg+NVgeNVgdZq/X/7HvfXfU1+Oi1F2LmdWfSRHGhpO4gln7/IOaefg/yknuFPb6h6CB6/fVBHLzjHjgLwh+fiGKbRpZgkSVY/J119Q1H8crvr8HvNm7EaSNOQ4PblzDVOL2ocXlR41T89741tRxegTK7B2X2luPLkq9Yh0Xrm/Nl1kow65r8rPXNrQpUAtSHUBGwsrISNpsNdy95Cfl9B0JI8vGbrAn+rEgyhBzY598uy82PlzQQctf0okmKAq/LjpJ9u/FppYQcpd7X66mVYdL47/2vlcX/M4dMtp9XiGBRF5vHX+DF4/u5qFLBjL88hwGjzoTOZA1+DiCp+N4rCmThhSQUSIoCWXggKV7I/pukeHw/i+M/t/RuH9q7Cw/Nn4vKysqYuXgPCP6tPrUUPfsOCGtsAfj+zmUthKyBImugyFoosgZCavKz/98ERdIAHfxb37X2i5h63WMyaVqyZAn+9re/oaysDCNGjMA///lPnHnmmZFuFkVQvasGn+19C1cMv0WV+NqaGnRb8RYO33gLnLHxt01EUUKSJCTpNUjSa04aAgn45lLVuo4nU3UuL+rdCupcCur9lQYVAdS6FNS6OvbtukbyzS3TSNLxwhnN7iUo/jldXiHgVQA3euAv35dDlmVUh+clAOA7p0ZCsC2+cvC+1yfwc9Or2sBSYqLJ715/gQ+vv82KaLJfliEbLegx5DRUAag65jxlm0yaQPIpNUlIZVh00vGf/YmpQRNf1RM9TQq32L0K7J7myVCju3li1NpcPgCAZMXgCVMB+IqxnEiWjr/38gmfv6afyaZDfwPv7fECL77PZzC+LEPp4HKjGsk3p1PXZLmBTEsGxl15PcpgxqF6V/B9j6WkumffARgwfGSbxwh/QRxfAZwmRXH8RXx881dFk1vn2yMB0Mr+pR/Q/N8cGb6/f1t9PY7s3AKc1a/zJ+piMZc0vfXWW7j11lvx7LPPYsyYMXjiiScwZcoU7Nq1C926dYt084iIiDpEr5GQZdIiy9Tyf8mKEGhw+xIo34Ws7yK20eO70A1c3DoVAbfXdwEUuL71CsDuDdZhbx9JRtPpaIELII0kBS98NTKg9d8Htjf9XSv5et8CxwcuoNQQSPo8isC+3bvx5P0L8dcn/olu3fNh9zZJDDwK7F7fa2f3V0i0ewXsXi+q2nEeWUIwgQr07Bm1Mgz+8vRGrQSD7Kv8qPf3+mnlphfpvtcl1MQrcPHrVZpWhfS9707/8NBAMROnf86d3f/8bf7Xw+7xHd9REhB8/k17PGuPluGvf3kAs+bfhl69C0/6bIQz2Wz6fnv9r4NbHL/g97SRAHgF4D2xmIslE5fduRg/AvjxhPKhTZ9roEpmoNiLocnv+ibvcfC99r/3oX7uA4VqPP6k0eOv/OnyClTBgMETL4bDmIySRk/wy4QTXweP/7PSGYH5nvomiWbwpjk+H1TT5L49z3nX4Z347OnFeHjuLzrXsAiIuaTp73//O2644QZcd911AIBnn30WH374IV566SX88Y9/jHDriIiIwkuWJCTrNUjWt39umdd/sRioAhj81h7i+KLA/m/wZaBJsiNh545tmHrhhXjszfcxYOiwqP+2PbCQsU6WoPM48NP/PkN3NGJUdmtlPXwX3vYmyafNI2DzJ5+NTXpXAsPRnP6y9L7S/ADg7XR7Nf5eNgnNF2CWA/XzRfMel+B7Fbhw7uTFb0skIDhk0aiRYDlhyOeJw0FNrfS2bTpah+9WvIYbb7ypQ5/Tzmj6frdX014Wd9OkyitQUVGB79b+D+dOvhCyyQKbW/F/0QD/58CLUN7vwKLbgR5WTdP3O9A+nPB+w/d+e0+V7EjZ+PVjr6ABQEN9+0qcBnrbTkzoT0qI/Nui/e+/K8VU0uRyubBx40YsXLgwuE2WZUyePBnr1q1r8TFOpxNO5/Eu+traWgBAXV1di8d3pYaGBgDA7q2bYW9sjHBrOubQvt0AgAM7t8NiMkW4NUCxbQ/gAHZv2Qy7ue3XsjNtT9+3B30B7PxxM6oj+F5F2+veEWx7ZBTv3wMA2LhxY/DfnFixa9cuALH5b2Ssv+4NVUex98dNcDbUR7o5HRKO193ivzXlBeDB/2/v7oOiqt44gH8vCIugsAoKIglIqSQvKQlCpZUkbpYQpWCGWqZUmhml6PQTsKaR8KUXh9GYUcAotCyx0nQAwUxUnLQJX0JSQBsEK0URJXT3/P5QNlf2hSV2Qfb7mdmBe+655569j8/Fh7v3Yo1mWOEfWOM6rHEDVrgOCTcgQQmrW8s3v6ogQQnp36+murdHCFhDwAoCPaCC9R1fW763hQo2t5ZtoYTNra/WEFrv8xEAGm+92uJuztWa0xX4InEeHs3IwNChN+8LUgG4ASs034q5ZrytoISkjvX1W8sq9debMYeJig0rIWAFFXpAQNl8DacrTmKAxyDY95TdvL9LiFv3dCkhCaX6eyuVCpL4974uAaD51qsztOTqlStXOv3/5C37F0L/byQkYahHF1JTU4OBAweipKQEoaGh6vZFixZhz549OHjwYKttUlJSsGzZMnNOk4iIiIiI7iJnz56Fh4eHzvV31ZWm9liyZAkSEhLUyyqVChcuXICzs3O3uqHzbnL58mXcc889OHv2LBwdHTt7OnQHxqdrY3y6Lsama2N8ui7Gpmvr7vERQqChoQHu7u56+91VRZOLiwusra1RV1en0V5XVwc3Nzet28hkMshkMo02uVxuqimSERwdHbtl8nUXjE/Xxvh0XYxN18b4dF2MTdfWnePj5KTtL/Bp6lp/gtwAW1tbBAUFobCwUN2mUqlQWFio8XE9IiIiIiKijnJXXWkCgISEBMyYMQMPPvgggoOD8dFHH6GxsVH9ND0iIiIiIqKOdNcVTTExMfjzzz+RlJSE2tpaPPDAA9i5cydcXV07e2rURjKZDMnJya0+NkldA+PTtTE+XRdj07UxPl0XY9O1MT433VVPzyMiIiIiIjK3u+qeJiIiIiIiInNj0URERERERKQHiyYiIiIiIiI9WDQRERERERHpwaKJOtTy5csxatQo9O7dG/3790dUVBTKy8v1bpOVlQVJkjRednZ2ZpqxZUlJSWl1rIcNG6Z3m6+++grDhg2DnZ0d/P39sWPHDjPN1vJ4eXm1io8kSZg7d67W/swd0/nxxx/x9NNPw93dHZIkIS8vT2O9EAJJSUkYMGAAevbsifDwcFRUVBgcNz09HV5eXrCzs0NISAhKS0tN9A66N33xuX79OhITE+Hv7w8HBwe4u7tj+vTpqKmp0Ttme86PpJ2h/Jk5c2arYz1hwgSD4zJ//jtDsdH2M0iSJKxYsULnmJaSOyyaqEPt2bMHc+fOxYEDB5Cfn4/r169j/PjxaGxs1Ludo6Mjzp07p35VV1ebacaWZ/jw4RrH+qefftLZt6SkBFOnTsWsWbNw5MgRREVFISoqCkePHjXjjC3HoUOHNGKTn58PAJg8ebLObZg7ptHY2IjAwECkp6drXZ+WloZPPvkE69atw8GDB+Hg4ICIiAg0NTXpHHPz5s1ISEhAcnIyDh8+jMDAQEREROD8+fOmehvdlr74XL16FYcPH8bSpUtx+PBhfPPNNygvL8ekSZMMjmvM+ZF0M5Q/ADBhwgSNY52bm6t3TOZPxzAUm9tjcu7cOWzYsAGSJOHZZ5/VO65F5I4gMqHz588LAGLPnj06+2RmZgonJyfzTcqCJScni8DAwDb3nzJlipg4caJGW0hIiIiPj+/gmZE2b7zxhvDx8REqlUrreuaOeQAQW7duVS+rVCrh5uYmVqxYoW6rr68XMplM5Obm6hwnODhYzJ07V72sVCqFu7u7WL58uUnmbSnujI82paWlAoCorq7W2cfY8yO1jbb4zJgxQ0RGRho1DvOn47UldyIjI8Xjjz+ut4+l5A6vNJFJXbp0CQDQt29fvf2uXLkCT09P3HPPPYiMjMSxY8fMMT2LVFFRAXd3dwwePBjTpk3DmTNndPbdv38/wsPDNdoiIiKwf/9+U0/T4jU3NyMnJwcvvfQSJEnS2Y+5Y36VlZWora3VyA0nJyeEhITozI3m5mb8/PPPGttYWVkhPDyc+WQGly5dgiRJkMvlevsZc36k/6a4uBj9+/fH0KFD8eqrr+Lvv//W2Zf50znq6uqwfft2zJo1y2BfS8gdFk1kMiqVCgsWLMBDDz0EPz8/nf2GDh2KDRs2YNu2bcjJyYFKpUJYWBj++OMPM87WMoSEhCArKws7d+7E2rVrUVlZiUceeQQNDQ1a+9fW1sLV1VWjzdXVFbW1teaYrkXLy8tDfX09Zs6cqbMPc6dztPz7NyY3/vrrLyiVSuZTJ2hqakJiYiKmTp0KR0dHnf2MPT9S+02YMAEbN25EYWEhPvjgA+zZswcKhQJKpVJrf+ZP58jOzkbv3r0RHR2tt5+l5E6Pzp4AdV9z587F0aNHDX6uNTQ0FKGhoerlsLAw+Pr64tNPP8V7771n6mlaFIVCof4+ICAAISEh8PT0xJdfftmm3ySR+axfvx4KhQLu7u46+zB3iPS7fv06pkyZAiEE1q5dq7cvz4/mExsbq/7e398fAQEB8PHxQXFxMcaNG9eJM6PbbdiwAdOmTTP4gCFLyR1eaSKTmDdvHr7//nsUFRXBw8PDqG1tbGwwYsQI/P777yaaHbWQy+UYMmSIzmPt5uaGuro6jba6ujq4ubmZY3oWq7q6GgUFBXj55ZeN2o65Yx4t//6NyQ0XFxdYW1szn8yopWCqrq5Gfn6+3qtM2hg6P1LHGTx4MFxcXHQea+aP+e3duxfl5eVG/xwCum/usGiiDiWEwLx587B161bs3r0b3t7eRo+hVCpRVlaGAQMGmGCGdLsrV67g1KlTOo91aGgoCgsLNdry8/M1rm5Qx8vMzET//v0xceJEo7Zj7piHt7c33NzcNHLj8uXLOHjwoM7csLW1RVBQkMY2KpUKhYWFzCcTaCmYKioqUFBQAGdnZ6PHMHR+pI7zxx9/4O+//9Z5rJk/5rd+/XoEBQUhMDDQ6G27be509pMoqHt59dVXhZOTkyguLhbnzp1Tv65evaruExcXJxYvXqxeXrZsmdi1a5c4deqU+Pnnn0VsbKyws7MTx44d64y30K299dZbori4WFRWVop9+/aJ8PBw4eLiIs6fPy+EaB2bffv2iR49eoiVK1eKEydOiOTkZGFjYyPKyso66y10e0qlUgwaNEgkJia2WsfcMZ+GhgZx5MgRceTIEQFArF69Whw5ckT99LXU1FQhl8vFtm3bxK+//ioiIyOFt7e3uHbtmnqMxx9/XKxZs0a9vGnTJiGTyURWVpY4fvy4mDNnjpDL5aK2ttbs7+9upy8+zc3NYtKkScLDw0P88ssvGj+L/vnnH/UYd8bH0PmR2k5ffBoaGsTbb78t9u/fLyorK0VBQYEYOXKkuO+++0RTU5N6DOaPaRg6twkhxKVLl4S9vb1Yu3at1jEsNXdYNFGHAqD1lZmZqe4zduxYMWPGDPXyggULxKBBg4Stra1wdXUVTz75pDh8+LD5J28BYmJixIABA4Stra0YOHCgiImJEb///rt6/Z2xEUKIL7/8UgwZMkTY2tqK4cOHi+3bt5t51pZl165dAoAoLy9vtY65Yz5FRUVaz2Utx1+lUomlS5cKV1dXIZPJxLhx41rFzNPTUyQnJ2u0rVmzRh2z4OBgceDAATO9o+5FX3wqKyt1/iwqKipSj3FnfAydH6nt9MXn6tWrYvz48aJfv37CxsZGeHp6itmzZ7cqfpg/pmHo3CaEEJ9++qno2bOnqK+v1zqGpeaOJIQQJr2URUREREREdBfjPU1ERERERER6sGgiIiIiIiLSg0UTERERERGRHiyaiIiIiIiI9GDRREREREREpAeLJiIiIiIiIj1YNBEREREREenBoomIiIiIiEgPFk1ERNSlSZKElJSUzp4GERFZMBZNRERklKysLEiSpPN14MABo8fcsWNHmwujkpISpKSkoL6+3uj9tMXWrVuhUCjg4uICW1tbuLu7Y8qUKdi9e7dJ9mesmpoapKSk4JdffunsqRARWYwenT0BIiK6O7377rvw9vZu1X7vvfcaPdaOHTuQnp6utXC6du0aevT498dVSUkJli1bhpkzZ0Iulxu9L12EEHjppZeQlZWFESNGICEhAW5ubjh37hy2bt2KcePGYd++fQgLC+uwfbZHTU0Nli1bBi8vLzzwwAOdOhciIkvBoomIiNpFoVDgwQcfNPl+7OzsTL4PAFi1ahWysrKwYMECrF69GpIkqde98847+OyzzzSKNyIishz8eB4REZlEVVUVJEnCypUrkZGRAR8fH8hkMowaNQqHDh1S95s5cybS09MBQONjfi1uv6cpJSUFCxcuBAB4e3ur+1ZVVWHs2LEIDAzUOpehQ4ciIiJC51yvXbuG5cuXY9iwYVi5cqXG/lvExcUhODhYvXz69GlMnjwZffv2hb29PUaPHo3t27drbNPyUcaqqiqN9uLiYkiShOLiYnXbo48+Cj8/Pxw/fhyPPfYY7O3tMXDgQKSlpWlsN2rUKADAiy++qH7/WVlZOt8bERH9d/yVGRERtculS5fw119/abRJkgRnZ2eNti+++AINDQ2Ij4+HJElIS0tDdHQ0Tp8+DRsbG8THx6Ompgb5+fn47LPP9O4zOjoaJ0+eRG5uLj788EO4uLgAAPr164e4uDjMnj0bR48ehZ+fn3qbQ4cO4eTJk/jf//6nc9yffvoJFy5cwIIFC2BtbW3wvdfV1SEsLAxXr17F/Pnz4ezsjOzsbEyaNAlbtmzBM888Y3AMbS5evIgJEyYgOjoaU6ZMwZYtW5CYmAh/f38oFAr4+vri3XffRVJSEubMmYNHHnkEADr9I4NERN0diyYiImqX8PDwVm0ymQxNTU0abWfOnEFFRQX69OkD4OZVn8jISOzatQtPPfUUQkNDMWTIEOTn5+OFF17Qu8+AgACMHDkSubm5iIqKgpeXl3rd5MmT8frrryMnJwepqanq9pycHDg4OCA6OlrnuCdOnAAA+Pv7G3zfAJCamoq6ujrs3bsXDz/8MABg9uzZCAgIQEJCAiIjI2FlZfyHOWpqarBx40bExcUBAGbNmgVPT0+sX78eCoUCrq6uUCgUSEpKQmhoqMHjRUREHYNFExERtUt6ejqGDBmi0abtKk1MTIy6YAKgvjpy+vTpDp2Pk5MTIiMjkZubi+XLl0OSJCiVSmzevBlRUVFwcHDQue3ly5cBAL17927Tvnbs2IHg4GB1wQQAvXr1wpw5c7BkyRIcP35c42pXW/Xq1UujELK1tUVwcHCHHysiIjIOiyYiImqX4ODgNj0IYtCgQRrLLQXUxYsXO3xO06dPx+bNm7F3716MGTMGBQUFqKurU1+50cXR0REA0NDQ0Kb9VFdXIyQkpFW7r6+ven17iiYPD49W91P16dMHv/76q9FjERFRx+GDIIiIyKR03SMkhOjwfUVERMDV1RU5OTkAbn40z83NTetHCW83bNgwAEBZWVmHzkfbAyUAQKlUam0357EiIqK2Y9FERESdTldxYWxfa2trPP/889iyZQsuXryIvLw8TJ061eDDHR5++GH06dMHubm5Ogua23l6eqK8vLxV+2+//aZeD/x7Ve3OP8RbXV1tcB+6GHOsiIioY7BoIiKiTtdyv9GdxUV7+sbFxeHixYuIj4/HlStX2vSwBHt7eyQmJuLEiRNITEzUemUnJycHpaWlAIAnn3wSpaWl2L9/v3p9Y2MjMjIy4OXlhfvvvx8A4OPjAwD48ccf1f2USiUyMjIMzkkXY44VERF1DN7TRERE7fLDDz+or6zcLiwsDIMHDzZqrKCgIADA/PnzERERAWtra8TGxurt+8477yA2NhY2NjZ4+umn1cXEiBEj4Ofnh6+++gq+vr4YOXJkm+awcOFCHDt2DKtWrUJRURGee+45uLm5oba2Fnl5eSgtLUVJSQkAYPHixcjNzYVCocD8+fPRt29fZGdno7KyEl9//bX6yXnDhw/H6NGjsWTJEly4cAF9+/bFpk2bcOPGDaOOz+18fHwgl8uxbt069O7dGw4ODggJCYG3t3e7xyQiIv1YNBERUbskJSVpbc/MzDS6aIqOjsbrr7+OTZs2IScnB0IInUXTqFGj8N5772HdunXYuXMnVCoVKisrNZ6ON336dCxatMjgAyBuZ2VlhY0bNyIyMhIZGRlYuXIlLl++jH79+mHMmDFIS0tDaGgoAMDV1RUlJSVITEzEmjVr0NTUhICAAHz33XeYOHGixriff/454uPjkZqaCrlcjlmzZuGxxx7DE088YdQxamFjY4Ps7GwsWbIEr7zyCm7cuIHMzEwWTUREJiQJ3l1KRETdzMcff4w333wTVVVVrZ7eR0REZCwWTURE1K0IIRAYGAhnZ2cUFRV19nSIiKgb4MfziIioW2hsbMS3336LoqIilJWVYdu2bZ09JSIi6iZ4pYmIiLqFqqoqeHt7Qy6X47XXXsP777/f2VMiIqJugkUTERERERGRHvw7TURERERERHqwaCIiIiIiItKDRRMREREREZEeLJqIiIiIiIj0YNFERERERESkB4smIiIiIiIiPVg0ERERERER6cGiiYiIiIiISI//A19nxHzZRdtpAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "entity_df = db_query(\n",
    "    \"\"\"\n",
    "MATCH (d:__Chunk__)\n",
    "RETURN count {(d)-[:HAS_ENTITY]->()} AS entity_count\n",
    "\"\"\"\n",
    ")\n",
    "# Plot distribution\n",
    "plt.figure(figsize=(10, 6))\n",
    "sns.histplot(entity_df[\"entity_count\"], kde=True, bins=15, color=\"skyblue\")\n",
    "plt.axvline(\n",
    "    entity_df[\"entity_count\"].mean(), color=\"red\", linestyle=\"dashed\", linewidth=1\n",
    ")\n",
    "plt.axvline(\n",
    "    entity_df[\"entity_count\"].median(), color=\"green\", linestyle=\"dashed\", linewidth=1\n",
    ")\n",
    "plt.xlabel(\"Entity Count\", fontsize=12)\n",
    "plt.ylabel(\"Frequency\", fontsize=12)\n",
    "plt.title(\"Distribution of Entity Count\", fontsize=15)\n",
    "plt.legend(\n",
    "    {\n",
    "        \"Mean\": entity_df[\"entity_count\"].mean(),\n",
    "        \"Median\": entity_df[\"entity_count\"].median(),\n",
    "    }\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "76d641a7-574e-4cd2-bfc1-27fa2eb8725b",
   "metadata": {},
   "source": [
    "Remember, text chunks have 300 tokens. Therefore, the number of extracted entities is relatively small, with an average of around three entities per text chunk. The extraction was done without any gleanings (a single extraction pass). It would be interesting to see the distribution if we increased the gleaning count.\n",
    "\n",
    "Next, we will evaluate the node degree distribution. A node degree is the number of relationships a node has."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "10eb4b97-632a-44d9-b452-6b9130a8c432",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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3bt3V/u1p0yZQvv27fH09LT5gqA8FouF8ePHEx4ejoeHB126dGHPHts1wk6fPk2/fv3w9fXF39+fIUOGVPtnoYK9DsgsDeWnn28kszTULpaTU48VK/qRk1OPHKMviwCTr6/DPl19fYm99VZcK9BWRERERKSuaNasGUeOHLE+1q1bZxMfOXIk//nPf1i6dCnfffcdhw8f5q677qr2fNLT03nppZeYM2cO//znPy+pL4vFQmlpaRVnWHEeHh6EhIRU+3WKi4vp06cPjz76aIXPmT59Om+88QZvv/02GzduxMvLi27dulFYWGht069fP7Zv386KFSv44osvWLt2LQ899FB1vAQrFex1wP6SVjz9y3fsL2llFzt6NI4XX1zE0aNxHHarzwNAcf36Dvv0joyk/Usv4R0ZWfUJi4iIiIjUUs7OzoSFhVkfQUFB1lhWVhbvvvsur776KjfffDOJiYnMmzePH374gR9//JH09HRuuukmAOrVq4fBYGDQoEHW881mM6NHjyYgIICwsDAmTpxY4XwiIyO555576NevH59//rm1v6lTpxIXF4eHhwctW7bk448/tp57brT/q6++IjExETc3N9atW4fZbGb69Ok0bNgQNzc3oqOjmTJlivW8AwcO0LdvX/z9/QkICOCOO+4gPT3dGh80aBC9e/dmxowZhIeHExgYSFJSEiUlJcDZ6f/79+9n5MiR1hkCYD8lvizvvPMOTZs2xd3dnSZNmvDWW285fI8uNGnSJEaOHEnz5s0r1N5isTBz5kyee+457rjjDlq0aMHChQs5fPgwn332GQA7d+5k+fLlvPPOO7Rt25YOHTrw5ptv8sEHH3D48OFK51hRKtjrADdyaeDyM27YT8dwcSkkIiIVF5dCXM1FxAOGoiKHfZqKisjZvx9TBdqKiIiIiFRIwRE4vdn2kbvvbMxUaB87vfl/52bvso8VnT4bKzxhH8u23/K4Ivbs2UNERAQNGjSgX79+ZGRkWGMpKSmUlJTQpUsX67EmTZoQHR3Nhg0biIqK4pNPPgFg165dHDlyhNdff93adsGCBXh5ebFx40amT5/O5MmTWbFiRaXy8/DwoLi4GICpU6eycOFC3n77bbZv387IkSPp378/3333nc05Y8aMYdq0aezcuZMWLVowduxYpk2bxrhx49ixYwdLliwhNPTsbN2SkhK6deuGj48P33//PevXr8fb25vu3btbrwuwevVq0tLSWL16NQsWLGD+/PnMnz8fgGXLlhEZGcnkyZOtMxUqYvHixYwfP54pU6awc+dOXnzxRcaNG8eCBQusbTp16mTzJUhV2LdvH0ePHrX5XP38/Gjbti0bNmwAYMOGDfj7+3Pttdda23Tp0gUnJyc2btxYpfmcz7naepY/TROP9czs350Ri5aztaCbTSw2dgdz5iTy0EMp5B3cyw/Azr17oV27cvvMSktjeZ8+dF+6lICEhGrMXkRERESuGHtmw2+TbI/F9oP2iyD/ICxPtD/nfsvZnxsGwakfbWPt3oe4/pDxEfw83DYW1hVu/rpS6bVt25b58+fTuHFjjhw5wqRJk7jhhhv47bff8PHx4ejRo7i6utqNEoeGhnL06FGMRiMBAQEAhISE2LVr0aIFEyZMAKBRo0bMmjWLVatWccstt1Qov5SUFJYsWcLNN99MUVERL774IitXrqTdH/9v36BBA9atW8fs2bPp2LGj9bzJkydbr5GTk8Prr7/OrFmzGDhwIADx8fF06NABgA8//BCz2cw777xjHRmfN28e/v7+rFmzhq5duwJnZxDMmjULo9FIkyZN6NWrF6tWrWLYsGEEBARgNBrx8fEhLCysom8/EyZM4JVXXrHeYhAXF8eOHTuYPXu2Ndfo6GjCw8Mr3GdFHD16FMD6pcU55z7Xc20unM7v7OxMQECAtU11UMEuIiIiIiJ/jkYPQ+Tttsdc65396RkJ3VMufm67+VCaZ3vMK/bsz+i+EHTBgJSzT6XT69Gjh/X3Fi1a0LZtW2JiYvjoo48YMmRIpfu7UIsWLWyeh4eHc/z48XLP2bZtG97e3phMJoqLi+nVqxezZs0iNTWV/Px8u2K/uLiYa665xubY+aPCO3fupKioiM6dO5d5va1bt5KamoqPj+37V1hYSFpamvV5s2bNMBqNNq9l27Zt5b6W8uTl5ZGWlsaQIUMYNmyY9XhpaSl+fn7W5wsXLrzka/wVqWAXEREREZE/h0f42UdZjO4Q0Pri5/o2vnjMPfjso4r5+/tz1VVXkZqaCkBYWBjFxcVkZmbajJ4fO3asQiPJLi4uNs8NBgNms7nccxo3bsznn3+Os7MzERERuLq6AljvKf/yyy+pf8EaVW5ubjbPvby8rL97eHiUe73c3FwSExNZvHixXSw4+H/v8aW8FkfXBZg7dy5t27a1iZ3/xUB1OPfZHTt2zGb0/tixY9Zt58LCwuy+XCktLeX06dOVmkVQWbqHXUREREREpAy5ubmkpaVZi7jExERcXFxYtWqVtc2uXbvIyMiwTks/V1CbTKYqycHV1ZWGDRsSGxtr7RsgISEBNzc3MjIyaNiwoc0jKirqov01atQIDw8Pm9dwvtatW7Nnzx5CQkLs+j1/pLsieVfmPQgNDSUiIoK9e/faXTcuLq7C/VyKuLg4wsLCbN6T7OxsNm7caP1c27VrR2ZmJikp/5sF8u2332I2m+2+YKhKKthFRERERESAJ598ku+++4709HR++OEH7rzzToxGI/fddx9wdiGyIUOGMGrUKFavXk1KSgqDBw+mXbt2XH/99QDExMRgMBj44osvOHHiRLXt0+3j48OTTz7JyJEjWbBgAWlpaWzevJk333zTZpG2C7m7u/P0008zevRoFi5cSFpaGj/++CPvvvsucHbrsqCgIO644w6+//579u3bx5o1a3j88cc5ePBghfOLjY1l7dq1HDp0iJMnT1bonEmTJjF16lTeeOMNdu/ezbZt25g3bx6vvvqqtc2AAQMYO3Zsuf1kZGSwZcsWMjIyMJlMbNmyhS1btth8Fk2aNOHTTz8Fzs4OGDFiBC+88AKff/4527ZtY8CAAURERNC7d28AmjZtSvfu3Rk2bBg//fQT69evZ/jw4dx7771ERERU+H2pLE2JrwO2FnTjprmWMmN79rTmppvOxnI8wQCkNG3qsM+AhATu3769KtMUEREREanVDh48yH333cepU6cIDg6mQ4cO/PjjjzZTwV977TWcnJy4++67KSoqolu3bjZbj9WvX59JkyYxZswYBg8ezIABA6yrp1e1559/nuDgYKZOncrevXvx9/endevWPPPMM+WeN27cOJydnRk/fjyHDx8mPDycRx55BABPT0/Wrl3L008/zV133UVOTg7169enc+fO+Pr6Vji3yZMn8/DDDxMfH09RUREWS9n1yvmGDh2Kp6cnL7/8Mk899RReXl40b96cESNGWNtkZGTg5FT+uPP48eNtvrQ4d0//6tWr6dSpE3B2ZkRWVpa1zejRo8nLy+Ohhx4iMzOTDh06sHz5ctzd3a1tFi9ezPDhw+ncubP138Abb7xRkbfjkhksFXnn6rDs7Gz8/PzIysqq1D/AP9vmzZtJ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Z59l2LBhVZ6slO2kOZYFh18uM5aVFcxnnyUBkONSj7eAIfXqOezTPSCAq+6/vyrTFBERERERkUqo0Aj7N998w0cffUTPnj3LLNYBYmJiGDt2LHv27OHmm2+u0iSrQ3JyMgkJCbRp06amU7ls9ZwOcXfwi9RzOmQX8/E5TZcui/DxOY1vaRb9AGNWlsM+izIz2fef/1CUmVn1CYuIiIiIiIhDFSrYmzZtWuEOXVxciI+Pv+SE/ixJSUns2LGDTZs21XQqly3a7TeG936WaLff7GJhYek8++wDhIWlE158mEWA6+HDDvvMO3yYDWPGkFeBtiIiIiIiIlL1LmmV+O+//57+/fvTrl07Dh06O6r7/vvvs27duipNTkRERERERORKVemC/ZNPPqFbt254eHjwyy+/UFRUBEBWVhYvvvhilScoIiIiIiIiciWqdMH+wgsv8PbbbzN37lyb+9n/9re/sXnz5ipNTkRERERERORKVemCfdeuXdx44412x/38/MjUAmU1Is/kR/reBuSZ/OxihYVebN9+PYWFXhQ6ebABMHt4OOzT2cODwJYtca5AWxEREREREal6FdrW7XxhYWGkpqYSGxtrc3zdunU0aNCgqvKSSkgtvp7Bq9LKjB040JjhwzcAkOOeR3sg5YLPriy+cXF0W7KkCrMUERERERGRyqh0wT5s2DCeeOIJ3nvvPQwGA4cPH2bDhg08+eSTjBs3rjpylCq2c+fOyzo/KCiI6OjoKspGREREREREylLpgn3MmDGYzWY6d+5Mfn4+N954I25ubjz55JM89thj1ZGjONDS42tm9u/OiEXL2VrQzSbWqNFm5sxJ5KGHUsha/T0/A6379+cXB33GurszpUEDnt27l/TCQpuYu7snu3btVNEuIiIiIiJSjSpdsBsMBp599lmeeuopUlNTyc3NJSEhAW9v7+rIT6pQaWkOABHhz+EUcWe5bUPM6VA0jqZNFxPoFGs9np+/k507+3Py5EkV7CIiIiIiItWo0gX7Oa6uriQkJFRlLvIncXOLwcendbltPEvcoQg8PZvg46LPWURERERE5M9WoYL9rrvuqnCHy5Ytu+RkREREREREROSsChXsfn7224WJiIiIiIiISPWpUME+b9686s5DLsPvBX9jyPxNHCppYhdLT0+gX789nDgRyXG3rTQEvN1iqeegz0zneD4M+C95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ijh06FCVJCWV09B1I3M7NqGh60a7WGTkbl57rRORkbuJKTrCaiCm6IDDPv1K0+l1ZhB+pelVn7CIiIiIiIg4VOH5zp9//rn196+//tpmSzeTycSqVauIjY2t0uSkYryMmTS8ahdeP2XaxTw8cmnV6js8PHLxNBfSCXjTnE+hgz6dLflElGzC2ZJfDRmLiIiIiIiIIxUu2Hv37g2AwWBg4MCBNjEXFxdiY2N55ZVXqjQ5ERERERERkStVhQt2s9kMQFxcHJs2bSIoKKjakhIRERERERG50lV6CfB9+/ZVRx4iIiIiIiIicp5L2rNr1apVrFq1iuPHj1tH3s957733qiSxyrjzzjtZs2YNnTt35uOPP/7Tr1/TDhY1Zc7nz3GwqKld7NixaF5+eS7HjkVzwiWIocARl1DcHPSZawxnrc8kco3h1ZKziIiIiIiIlK/Sq8RPmjSJrl27smrVKk6ePMmZM2dsHjXhiSeeYOHChTVy7drglDma/zv2PKfM0Xax7Owg/vvfoWRnB5Hp7MO7QKazv8M+i5zqscvj7xQ51av6hEVERERERMShSo+wv/3228yfP58HHnigOvK5JJ06dWLNmjU1nUaNCXTKoGvwXL45McyuaPf1PUmHDp+xbl1vig7lMATYUZrpsE838xlii1aR7tZZRbuIiIiIiEgNqPQIe3FxMe3bt6+yBNauXcttt91GREQEBoOBzz77zK5NcnIysbGxuLu707ZtW3766acqu35dEOm2k4duf4FIt512sdDQDJ56ahihoRmEl5zkHSC85JjDPr1NR7gxZwLepiPVkLGIiIiIiIg4UumCfejQoSxZsqTKEsjLy6Nly5YkJyeXGf/www8ZNWoUEyZMYPPmzbRs2ZJu3bpx/PjxKstBREREREREpLap9JT4wsJC5syZw8qVK2nRogUuLi428VdffbVS/fXo0YMePXpcNP7qq68ybNgwBg8eDJydkv/ll1/y3nvvMWbMmMqmT1FREUVFRdbn2dnZle5DREREREREpLpVumD/9ddfadWqFQC//fabTcxgMFRJUucUFxeTkpLC2LFjrcecnJzo0qULGzZsuKQ+p06dyqRJk6oqRREREREREZFqUemCffXq1dWRR5lOnjyJyWQiNDTU5nhoaCi///679XmXLl3YunUreXl5REZGsnTpUtq1a1dmn2PHjmXUqFHW59nZ2URFRVXPC/iT5Jn8Sd3dmDyTv12soMCbLVs6UlDgTb6TO2uAfCdPh32WGjw57NKGUoPjtiIiIiIiIlL1Lmkf9tpm5cqVFW7r5uaGm5ujXcj/WlKL2zLsu9/LjB08eBUjR64B4JhbODcBTd2iCC2z9f9kOcfyZb35VZmmiIiIiIiIVEKlC/abbrqp3Knv33777WUldL6goCCMRiPHjtmuan7s2DHCwsKq7Dp/dQaLCRdDISUWdywGo23MYMbZuYTSUhcMFjOugMFidtypxYwTpZhxBkOl1yYUERERERGRy1TpSqxVq1a0bNnS+khISKC4uJjNmzfTvHnzKk3O1dWVxMREVq1aZT1mNptZtWrVRae8X4laeK7k62HetPC0n2nQsOEWvvnGnYYNt9CkcD9FQJPCPQ77DCz9nSEnriGwtOyRexEREREREalelR5hf+2118o8PnHiRHJzcyudQG5uLqmpqdbn+/btY8uWLQQEBBAdHc2oUaMYOHAg1157Lddddx0zZ84kLy/Pumq8iIiIiIiISF1UZfew9+/fn+uuu44ZM2ZU6ryff/6Zm266yfr83IJwAwcOZP78+dxzzz2cOHGC8ePHc/ToUVq1asXy5cvtFqITERERERERqUuqrGDfsGED7u7ulT6vU6dOWCyWctsMHz6c4cOHX2pqIiIiIiIiIn85lS7Y77rrLpvnFouFI0eO8PPPPzNu3LgqS6y6JScnk5ycjMlkqulUREREREREROxUumD38/Ozee7k5ETjxo2ZPHkyXbt2rbLEqltSUhJJSUlkZ2fbvaa/mh0FN9L/vR0cN8Xaxfbtu5o+fQ6QmRnCcfdtRAKB7g0IcNDnGeeGLAlcRYGTo5YiIiIiIiJSHSpdsM+bN6868pDLUIIHh0xNy4yVlrpy8mTk2XYGZw4BvgYXh32aDa7kGbV1noiIiIiISE255A22U1JSWLRoEYsWLeKXX36pypykkmJdfuGVNu2IdbH/HMLD9zJhQh/Cw/cSWXycj4DI4sMO+/QxHaBz1kh8TAeqIWMRERERERFxpNIF+/Hjx7n55ptp06YNjz/+OI8//jiJiYl07tyZEydOVEeO4oCf83Fat/oRP+fjdjFv70w6dfoYb+9MfEx59AF8TDkO+3Q159Cg6BtczY7bioiIiIiISNWrdMH+2GOPkZOTw/bt2zl9+jSnT5/mt99+Izs7m8cff7w6chQRERERERG54lT6Hvbly5ezcuVKmjb93z3TCQkJJCcn/6UWnRMRERERERGpzSo9wm42m3FxsV+0zMXFBbPZXCVJiYiIiIiIiFzpKl2w33zzzTzxxBMcPvy/hcsOHTrEyJEj6dy5c5UmJxVztLghS795iKPFDe1iJ09GMHfui5w8GcEJl3qMBU64BDnsM98pmJ+8RpDvFFwNGYuIiIiIiIgjlS7YZ82aRXZ2NrGxscTHxxMfH09cXBzZ2dm8+eab1ZFjtUhOTiYhIYE2bdrUdCqX7Zgpnrf2z+aYKd4uduZMGEuWjOXMmTBOOvszDTjpHOiwzwJjMFu9hlFgVMEuIiIiIiJSEyp9D3tUVBSbN29m5cqV/P777wA0bdqULl26VHly1SkpKYmkpCSys7Px8/Or6XQui5/hKNf7fcqPWXeSZbHdO93LK5OWLdeydeuN+JjyuA04VqFV4rMJK/mZoy7XUuzkW02Zi4iIiIiIyMVc0j7sBoOBW265hccee4zHHnvsL1es1zWx7lsZ0+cfxLpvtYtFROxlypQ7iIg4uw/751R0H/aDdMt6DB/TwWrIWERERERERBypcMH+7bffkpCQQHZ2tl0sKyuLZs2a8f3331dpciIiIiIiIiJXqgoX7DNnzmTYsGH4+tpPj/bz8+Phhx/m1VdfrdLkRERERERERK5UFS7Yt27dSvfu3S8a79q1KykpKVWSlIiIiIiIiMiVrsIF+7Fjx8rcf/0cZ2dnTpw4USVJSeUUmr04ejiMQrOXXay42J309ASKi90pdnJlO1Ds5OawT5PBlTPGeEwG12rIWERERERERByp8Crx9evX57fffqNhQ/u9vgF+/fVXwsPDqywxqbhdRR2478sjZcb2709g8ODtABxz+4WrgaZusYQ66DPTuSEfB35etYmKiIiIiIhIhVV4hL1nz56MGzeOwsJCu1hBQQETJkzg1ltvrdLkRERERERERK5UFS7Yn3vuOU6fPs1VV13F9OnT+fe//82///1vXnrpJRo3bszp06d59tlnqzNXuYjm7iv5qr87zd1X2sXi47fwxRe+xMdvoUnhfrKAJoV7HPYZULKTgSeuI6BkZzVkLCIiIiIiIo5UeEp8aGgoP/zwA48++ihjx47FYrEAZ/dk79atG8nJyYSGOppoLdXByWDC3aMIJ4PJPuZkxssrBycnMwaLGV/AYDE77NOABVdLHgYs1ZCxiIiIiIiIOFLhgh0gJiaG//73v5w5c4bU1FQsFguNGjWiXr161ZVftUlOTiY5ORmTyb7IFREREREREalplSrYz6lXrx5t2rSp6lz+VElJSSQlJZGdnY2fn19NpyMiIiIiIiJio8L3sIuIiIiIiIjIn+eSRtildtldeD0jFi1nd+H1drGMjCY89FAKGRlNOO62hdYAbjE4mlOQ6RzHsnpLyXSOq46URURERERExAEV7HVAgcWPrQXdyowVFXmyZ09rAAqd3NgJNHVyd1iwmwwenHJJqNpERUREREREpMI0Jb4OiHT+jfHNbiXS+Te7WEhIBk88kURISAbhJSeZBYSXHHPYp5fpMO1znsfLdLgaMhYRERERERFHVLDXAYEuh7ip/ZcEuhyyi/n5naR377fw8zuJf2kOSYB/aabDPt3NmTQr+AB3s+O2IiIiIiIiUvVUsIuIiIiIiIjUQirYRURERERERGohFewiIiIiIiIitZAK9jrgZHE033x/JyeLo+1iZ86EsHTpSM6cCeG0sy+vAqed6znss9ApgG0eAyh0CqiGjEVERERERMQRbetWBxwyNWXq78vKjJ08Gclbb70KwDGXQP4JNHUJIdRBn3nGMH70ebpqExUREREREZEKu2JH2JOTk0lISKBNmzY1ncpl8+I0bTw/w4vTdjF391wSEjbg7p6Lp7mQ6wFPc77DPp3NeYSUbMHZnFcNGYuIiIiIiIgjV2zBnpSUxI4dO9i0aVNNp3LZGnpsYnq/O2noYf9aoqJ2k5zcnqio3cQUHWEDEFN0wGGffqb93HGmH36m/dWQsYiIiIiIiDhyxRbsIiIiIiIiIrWZCnYRERERERGRWkgFu4iIiIiIiEgtpIK9Dii1uJKX7UWpxdUuZjI5k5kZhMnkjMlg5ARgMjjeHMBiMFJgqIfFYKyGjEVERERERMQRbetWB2wvvIlbP8wtM7Z3bwvuvPMEAMfctxECNHWPd7it22nnxiwKXle1iYqIiIiIiEiFaYRdREREREREpBZSwV4HNHFby9Lbg2nittYuFhu7nUWLGhIbu52GRQfZAzQs2uewz3qlqfQ91Z16panVkLGIiIiIiIg4ooK9DnBzKiAo9CRuTgV2MReXIurXT8PFpQgXcwkNARdzscM+nSzF+JkO4GRx3FZERERERESqngp2ERERERERkVpIBbuIiIiIiIhILaSCXURERERERKQW0rZudcDewtZM/ug99ha2tosdOtSQ0aOXc+hQQ467htINOO0aibeDPrON0XzlN5tsY3S15CwiIiIiIiLlu2IL9uTkZJKTkzGZTDWdymXLsQSzOmtwmbH8fF82beoGQJ7Rk5+BpkYvhwV7iZM3B906VG2iIiIiIiIiUmFX7JT4pKQkduzYwaZNm2o6lcsWZtzDEw0GEWbcYxcLCDjCwIETCQg4QlDJGSYAQSUnHfbpYTpB69xkPEwnqiFjERERERERceSKLdjrklDXvfTuvIBQ1712scDAIwwaNInAwCMEl2YyEQguPeWwT0/zCRLz38LTrIJdRERERESkJqhgFxEREREREamFVLCLiIiIiIiI1EIq2EVERERERERqIRXsdUBmaSg//XwjmaWhdrGcnHqsWNGPnJx6ZBu9WARkG30c9lns5Mset1spdvKthoxFRERERETEkSt2W7e6ZH9JK57+5bsyY0ePxvHii4sAOOYawgNAU9cI7Et7WznGSNb4vVS1iYqIiIiIiEiFaYS9DnAjlwYuP+NGrl3MxaWQiIhUXFwKcTUXEw+4mosc9mm0FOFbuh+jxXFbERERERERqXoq2OuAJh7reXdQG5p4rLeLxcbuYPHiRsTG7iC+6BCpQHxRusM+/UvTuOd0T/xL06o+YRERkf9v787Do6zvvY9/ZklmsgcSSEggJCyGgIjsInWFij484lY9WqiAC542PC60ikvB7SCidTlqilZPpbZY14oVaxXZFETAsAoxIDsJSQgQQvbMzO/5w+O0cYAJkjA3k/frurhg7u8vX75z8btgPtx37hsAAARFYAcAAAAAwIII7AAAAAAAWBCBHQAAAAAACyKwAwAAAABgQTzWLQysrx2li142R61t3TpAF130Xa00qkA2STlR2UEf63Ygorde7ripZQcFAAAAADQbZ9gBAAAAALAgzrCHgR6RX+qB88Zqxudz9W3DOU1qXboUaurUCZo1a46idhfrfyQ9Wr9btUF6Jnh26ILKB7Q0foYOO7NabfYfa/fu3SovLz+pHvX19XK5XCfVIzk5WRkZGSfVAwAAAACOps0G9ry8POXl5cnr9YZ6lJMW4ziszG7bFfPF4YCa212tPn2+lNtdrShfvYZJivLVBg3sTlOrFM96OU2wlafe7t27lZ2do7q6mpPsZJfkO6kObne0CgsLCO0AAAAAWlybDey5ubnKzc1VZWWlEhISQj0OTkB5ebnq6mqUk/MXRUfn/KgeBw78Qzt3TlNm5stKShrwo3rU1BSooGCcysvLCewAAAAAWlybDew4/UVH5ygu7seHbUmKisr+0T0AAAAAoDVx0zkAAAAAACyIwB4GdtefqRfmzdDu+jMDaiUlmZox488qKclUcWQHjZNUHNkpaM8qR5oWxz+uKkdaK0wMAAAAAAiGS+LDwCFfut7df/9Ra0eOtNenn46TJB12xGqupBxHvNxBetbbE/Wt+/KWHRQAAAAA0GycYQ8DyfadGp92t5LtOwNqCQn7deWVeUpI2K92nkr9SlI7T0XQnm7fQfWueV1u38EWnxcAAAAAEByBPQykuwo1YfTvlO4qDKh17LhHd9wxWR077lFq4wHlSUptLA3aM8ZbouFVMxTjLWmFiQEAAAAAwRDYAQAAAACwIAI7AAAAAAAWRGAHAAAAAMCCCOxhoMrbTgUFfVXlbRdQq6mJ0+rVl6imJk41jih9LKnGER20Z6MtRnsjz1WjLaYVJgYAAAAABMNj3cLAtoYh+tWyDUetFRX11D33fCxJKo1M1aWSciK7KCVIz0pnV32U+HLLDgoAAAAAaDbOsIcBuxoVZ9svuxoDa3avoqMrZbd7ZTc+xUmyG2/QnjbjVYSvSrZmrAUAAAAAtDwCexjoG7VIf7+lo/pGLQqode++Xh9+mKDu3dcru26XKiVl130btGd7T6EmlA9Ve0/go+IAAAAAAK2PwA4AAAAAgAUR2AEAAAAAsCACOwAAAAAAFkRgBwAAAADAgnisWxjYVHuBrv2fHarwpQbUtm/vqyuvLFNVVaLK3BvVQVInd3clBel50NlTf07+XPW2uFaZGQAAAABwfAT2MOCRW+W+zKPWvN4IHT7c4bt1NqfKJXWwBf9jN7YI1dnat+CUAAAAAIATwSXxYSArMl/PnTNQWZH5AbW0tG36r/8ao7S0berSUKr3JXVpKAraM86zW5dU5CrOs7sVJgYAAAAABNNmA3teXp569+6twYMHh3qUkxbvKFffvmsU7ygPqMXEHNbw4R8oJuawYr01GiMp1lsVtGekqVLXhiWKNMHXAgAAAABaXpsN7Lm5udq8ebNWr14d6lEAAAAAAAjQZgM7AAAAAABWRmAHAAAAAMCCCOxhoLihp+b+8/+puKFnQK28PF2///1TKi9PV1lEe02RVBbRIWjPGkdHfRl7t2ocHVthYgAAAABAMDzWLQzs93bTK3ueO2rt0KEUvf32FEnSAWeCnpGU42yvlCA9a+3J2hg9oUXnBAAAAAA0H2fYw0CivViXt39aifbigFps7CFdcMHbio09pHhvtX4mKd57JGjPSN9hZdV9rEjf4VaYGAAAAAAQDIE9DHR1bdSUa36trq6NAbVOnXbooYeuU6dOO5TeUKa3JaU3BAb7H4rzFmlk5RTFeYM/sx0AAAAA0PII7AAAAAAAWBCBHQAAAAAACyKwAwAAAABgQQT2MFDnjdXe3V1U540NqNXXR2nLlv6qr49SvT1SayTV211Be3ptLpU7c+S1BV8LAAAAAGh5PNYtDBQ2DNcvPt591Nru3Tm67bY1kqRS1xoNlJTjygz6WLcKZ3e91/6dlh0UAAAAANBsnGEHAAAAAMCCCOxh4Cz3J1owwamz3J8E1Hr0WKuPP3apR4+1yqnbqTpJOXVbgvZMaizQTWVnK6mxoBUmBgAAAAAEQ2APAzabkTPCK5vNHLUWGdnwXc0YuSTJBK4LZORQo6TmrAUAAAAAtDQCOwAAAAAAFkRgBwAAAADAggjsAAAAAABYEI91CwOFtcP0y9eWamf92QG1XbtyNHHi1you7qYy13r1kRTpylRikJ4Vzm56p/37qnR0boWJAQAAAADBENjDQJ3i9U39+UetNTREaefOPpKkenukCiTl2F1Be3ptbh1y9mjJMQEAAAAAJ4BL4sNAl4gNevSsn6pLxIaAWkrKLv3mN7coJWWX0hrL9bKktMaSoD1jvcU6r3K6Yr3FrTAxAAAAACAYAnsYaO/cp58M/VTtnfsCavHxBzR69P8oPv6AEjxHdIukBM/hoD1dvgr1qntXLl9Fyw8MAAAAAAiKwA4AAAAAgAUR2AEAAAAAsCACOwAAAAAAFkRgDwNljV314ZLrVdbYNaB26FCK5s69V4cOpeiAM0EzJR1wtg/as9aepHXRt6jWntQKEwMAAAAAguGxbmFgn6eXfrf1r0etlZen65VXZkqSyiLa635JOREdlBKkZ40jRatj72rZQQEAAAAAzcYZ9jAQayvX8Ng3FGsrD6hFRR1Rv35LFBV1RNHeWl0gKdpbE7RnhK9anRpWKcJX3QoTAwAAAACCIbCHge7ufP3XDTeouzs/oNa581Y9++xF6tx5q7o2lGiJpK4Ne4L2jPfu0v+tmKh4766WHxgAAAAAEBSBHQAAAAAAC+J72BEyBQUFp/TrAAAAAOB00mYDe15envLy8uT1ekM9SpvT0LBPkl3jxo07yT71LTMQAAAAAFhQmw3subm5ys3NVWVlpRISEkI9zklp9Ll0+GCCGn2ugJrHE6H9+9Pl8UTIY3NqrySPLfgfu8/mVJU9Rb5mrD1RHk+FJJ8yM19WUtKAE/76Awf+oZ07p8nj8bT4bAAAAABgFW02sIeTzfUX6sp3K45a27Gjr667bq8kqdS9QV0k5bi7B32s2yHnGfpr8qIWnfOHoqKyFRd34oG9poZL4gEAAACEP246BwAAAACABRHYw0Bv1xLNuyZRvV1LAmpZWRv11ludlZW1UT3r9miPpJ5124L2bOfZohvKL1Y7z5aWHxgAAAAAEBSBPQxE2OuV0P6wIuyBN2FzOhvVoUORnM5GOY1HnSU5TfDv/bYbj2J9pbI3Yy0AAAAAoOUR2AEAAAAAsCACOwAAAAAAFkRgBwAAAADAgnisWxjYVjdQv/3rX7WtbmBAbe/enrrzzsXau7enyiJTdaGkqsguigvSs9LRVfMTX1Wlo2trjAwAAAAACILAHgaqTLKWV11/1FptbZzWr79QklTjiFK+pBxHdNDA3miP0b7IIS05JgAAAADgBHBJfBjo5PxGv+l5gzo5vwmoJScX6ZZb7lNycpE6Nh7UY5I6Nu4P2jPaW6rBVc8o2lvaChMDAAAAAIIhsIeBjhG7NPrCN9QxYldArV27Uo0d+7jatStVkuew7pOU5DkYtGeU74DOrnlFUb4DrTAxAAAAACAYAjsAAAAAABZEYAcAAAAAwIII7AAAAAAAWBCBPQwc9HTSspUjddDTKaBWWZmkDz+8WZWVSTrsjNMrkg47E4L2rLcn6hv3Naq3J7b8wAAAAACAoHisWxjY03iWpm1YcNRaaWlX/e53r3z364hk3SopJyJVKUF6VjnS9Hn8Iy07KAAAAACg2TjDHgbcqlQv12dyqzKgFhlZq8zMTYqMrJXL16Dekly++qA9HaZO7TzfymHqWmFiAAAAAEAwBPYwkB21QrNvvEDZUSsCal27FujVV89U164F6lZfpE2SutXvDNoz0bNdPzt4hRI921t+YAAAAABAUAR2AAAAAAAsiMAOAAAAAIAFEdgBAAAAALAgAnsYMMYmT6NDxtiOWmtoiPyuZrOpXpJsgesC2eRVhKTmrAUAAAAAtDQe6xYGNtRdop/O8Ry19u23/TVq1Hd3hS91b5ZbUo77jKCPdTsQkaM/dlzXonMCAAAAAJqPM+wAAAAAAFgQgT0MZEcu159HZSg7cnlALSOjQC+9NEAZGd891i1fzX2s2zZddfBnSvRsa/mBAQAAAABBEdjDgNtRpc4Ze+R2VAXUXK5anXHGWrlctXL5GjRAkstXH7Snw9Qr2VMghwm+FgAAAADQ8gjsAAAAAABYEIEdAAAAAAALIrADAAAAAGBBBPYwsKu+r55+9yntqu8bUNu3L0sPPfSW9u3LUlFkR10rqSgyLWjPI450fRr/tI440lthYgAAAABAMDyHPQxU+NL0wcEpR61VVbXT0qXXSpIqHTF6R1KOI05RQXo22BO0wz2qZQcFAAAAADQbZ9jDQAfHdt3S5XZ1cGwPqLVrV6prr31a7dqVKslzWHdJSvIcDNozyleuvjVzFOUrb4WJAQAAAADBENjDQFrkVo299HmlRW4NqCUnF+lXv/q1kpOL1LHxoJ6W1LFxf9Ce0d4ynVP1pKK9Za0wMQAAAAAgGAI7AAAAAAAWRGAHAAAAAMCCCOwAAAAAAFgQgT0MVHqTtXHjAFV6kwNq1dUJWr78clVXJ6jKEa2/S6pyxAbt2WCL1a7IC9VgC74WAAAAANDyeKxbGNjRMFC3f5l/1FpxcXf99rd/lySVRqboCkk5kelKCdLziDNDnyTmteygAAAAAIBm4wx7GHCqTsn2nXKqLqDmcDQqIWG/HI5GOY1HyZKcxhO0p800yu07KJtpbIWJAQAAAADBENjDQJ+opXr75iz1iVoaUOvWbaPmzeuobt02qmfdHu2X1LNuW9Ce7T1b9Yvy89TeE/ioOAAAAABA6yOwAwAAAABgQQR2AAAAAAAsiMAOAAAAAIAFEdgBAAAAALAgHusWBjbWXqwxr5Sp2iQG1LZt66fRow+rri5Gpe5NipeU4e6hDkF6HnRma07ySnlsUa0xMgAAAAAgCAJ7GPApQkfM0SO4z+dQTU38d7+22XVEks/mCNrT2BxqtMW25JgAAAAAgBMQFpfEz58/X9nZ2erZs6deeeWVUI9zynWPXKXf/+QsdY9cFVBLT9+qJ54YpfT0reraUKJ/SurasCdoz3jPLl1WcaviPbtaYWIAAAAAQDCnfWD3eDyaMmWKFi1apLVr1+rJJ5/UgQMHQj3WKRXrOKScnI2KdRwKqEVHH9HgwZ8oOvqIor21GiUp2lsTtGeEqVbnhi8UYapbYWIAAAAAQDCnfWBftWqV+vTpo/T0dMXGxuqyyy7TJ598EuqxAAAAAAA4KSEP7J999pkuv/xypaWlyWazad68eQFr8vLylJmZKbfbraFDh2rVqn9d+l1cXKz09HT/6/T0dBUVFZ2K0QEAAAAAaDUhD+zV1dXq16+f8vLyjlp/8803NWXKFD344INas2aN+vXrp1GjRqmsrOwUTwoAAAAAwKkT8rvEX3bZZbrsssuOWX/66ad16623auLEiZKkF198UR9++KH++Mc/6t5771VaWlqTM+pFRUUaMmTIMfvV19ervr7e/7qysrIF3kVoFdVna86Hv1FRfXZAraysi/77v19QWVkX7Y9IUq6kkogURQbpWe1I1fLYB1TtSG2VmcNJQUHBSX19cnKyMjIyWmgaAAAA4PS0e/dulZeXn1SPcPtsHfLAfjwNDQ3Kz8/Xfffd5z9mt9s1cuRIrVixQpI0ZMgQff311yoqKlJCQoI++ugjTZs27Zg9Z86cqYcffrjVZz+Vyn2Z+lPxk0etHT7cQfPm5UqSDjnj9XtJOc5EpQTpWWdvr83RP2/ZQcNMQ8M+SXaNGzfupPq43dEqLCwIq79YAAAAgBOxe/duZWfnqK4u+A2yjyfcPltbOrCXl5fL6/UqJaVpvExJSdE333wjSXI6nXrqqad00UUXyefz6Z577lFSUtIxe953332aMmWK/3VlZaW6dOnSOm/gFGlnL9LFSX/SogPjdciX3qQWF3dQQ4f+QytX/h/VFVdprKRt3uBXFbh8FerS8Ln2RJ6nenti6wx+mvN4KiT5lJn5spKSBvyoHjU1BSooGKfy8vKw+UsFAAAAOFHl5eWqq6tRTs5fFB2d86N6hONna0sH9uYaM2aMxowZ06y1LpdLLperlSc6tTJcX2vylQ/o278M1KHapoE9NXWnHnjgF5o0KV8RG/frL5Kuading0F6xnqLdVHlvfpbu7cJ7EFERWUrLu7HBXYAAAAA/xIdncNn638T8pvOHU9ycrIcDodKS0ubHC8tLVVqKt9bDQAAAAAIX5YO7JGRkRo4cKAWLlzoP+bz+bRw4UINGzYshJMBAAAAANC6Qn5JfFVVlb799lv/6x07dmjdunVq3769MjIyNGXKFI0fP16DBg3SkCFD9Oyzz6q6utp/13gAAAAAAMJRyAP7V199pYsuusj/+vsbwo0fP15z5szRf/zHf2j//v2aPn26SkpKdPbZZ+uf//xnwI3o2rJqb4J2bu+mam9CQK2uLkabNp2juroY1dpdWiGp1h4VtKfHFqVSZz95bMHXAgAAAABaXsgD+4UXXihjzHHXTJ48WZMnTz5FE51+vm04RxMXbjtqbc+ebE2e/N0j8EpdaTpXUo4rI+hj3Q47s/T39q+37KAAAAAAgGaz9Pewt6a8vDz17t1bgwcPDvUoAAAAAAAEaLOBPTc3V5s3b9bq1atDPcpJ6xf1sRbfalO/qI8Daj17rtHixTb17LlGObU7ZCTl1BYG7ZnUuFm3lvVRUuPmVpgYAAAAABBMmw3sAAAAAABYGYEdAAAAAAALIrADAAAAAGBBBHYAAAAAACwo5I91w8n7pna4bp6zWkWNvQJqO3f21tixW7V/f2eVudarh6RYV6baBelZ4eyuN9v/Q9WO1FaZGQAAAABwfAT2MFCvWG1vHHTUWmOjW8XFPSRJDfZIbZOUY3cF7em1uVTp7NqSYwIAAAAATgCXxIeBrhHrNKv/BeoasS6glpq6Q/ffP06pqTuU3lCmP0tKbygO2jPOu1cXHp6qOO/elh8YAAAAABBUmw3seXl56t27twYPHhzqUU5aorNUQwZ9pkRnaUAtLu6QfvrTuYqLO6R4b7XGSYr3HgnaM9JXqZ718xXpq2yFiQEAAAAAwbTZwJ6bm6vNmzdr9erVoR4FAAAAAIAAbTawAwAAAABgZW3+pnPGGElSZaW1L/2uqqqSJHm9VfJ4ms5a31ityprvfv5hraGhSpWV3/3c6KtTpaRGX23Auh9q9FSpxutVo6dKHtu/1nq9Nf/7c+Dv1Vwn28MKM7Rcj+/+XKuqqiy/BwEAAIDWcry801yn02fr7+f7Po8ei80EWxHm9u7dqy5duoR6DAAAAABAG7Nnzx517tz5mPU2H9h9Pp+Ki4sVFxcnm80W6nGOqbKyUl26dNGePXsUHx8f6nFwGmDP4ESxZ3Ci2DM4EewXnCj2DE7U6bRnjDE6cuSI0tLSZLcf+zvV2/wl8Xa7/bj/o2E18fHxlt98sBb2DE4UewYnij2DE8F+wYliz+BEnS57JiEhIegabjoHAAAAAIAFEdgBAAAAALAgAvtpwuVy6cEHH5TL5Qr1KDhNsGdwotgzOFHsGZwI9gtOFHsGJyoc90ybv+kcAAAAAABWxBl2AAAAAAAsiMAOAAAAAIAFEdgBAAAAALAgAjsAAAAAABZEYD8N5OXlKTMzU263W0OHDtWqVatCPRIsYubMmRo8eLDi4uLUsWNHXXnllSosLGyypq6uTrm5uUpKSlJsbKyuueYalZaWhmhiWM3jjz8um82mO++803+MPYMfKioq0rhx45SUlKSoqCj17dtXX331lb9ujNH06dPVqVMnRUVFaeTIkdq6dWsIJ0Yoeb1eTZs2TVlZWYqKilL37t316KOP6t/vc8yeads+++wzXX755UpLS5PNZtO8efOa1JuzPw4ePKixY8cqPj5eiYmJuvnmm1VVVXUK3wVOpePtmcbGRk2dOlV9+/ZVTEyM0tLSdOONN6q4uLhJj9N1zxDYLe7NN9/UlClT9OCDD2rNmjXq16+fRo0apbKyslCPBgtYunSpcnNz9eWXX2rBggVqbGzUJZdcourqav+au+66Sx988IHefvttLV26VMXFxbr66qtDODWsYvXq1XrppZd01llnNTnOnsG/O3TokIYPH66IiAh99NFH2rx5s5566im1a9fOv+aJJ57Qc889pxdffFErV65UTEyMRo0apbq6uhBOjlCZNWuWZs+erRdeeEEFBQWaNWuWnnjiCT3//PP+NeyZtq26ulr9+vVTXl7eUevN2R9jx47Vpk2btGDBAs2fP1+fffaZJk2adKreAk6x4+2ZmpoarVmzRtOmTdOaNWv0t7/9TYWFhRozZkyTdaftnjGwtCFDhpjc3Fz/a6/Xa9LS0szMmTNDOBWsqqyszEgyS5cuNcYYU1FRYSIiIszbb7/tX1NQUGAkmRUrVoRqTFjAkSNHTM+ePc2CBQvMBRdcYO644w5jDHsGgaZOnWp+8pOfHLPu8/lMamqqefLJJ/3HKioqjMvlMn/9619PxYiwmNGjR5ubbrqpybGrr77ajB071hjDnkFTksx7773nf92c/bF582Yjyaxevdq/5qOPPjI2m80UFRWdstkRGj/cM0ezatUqI8ns2rXLGHN67xnOsFtYQ0OD8vPzNXLkSP8xu92ukSNHasWKFSGcDFZ1+PBhSVL79u0lSfn5+WpsbGyyh3r16qWMjAz2UBuXm5ur0aNHN9kbEnsGgf7+979r0KBBuvbaa9WxY0f1799fL7/8sr++Y8cOlZSUNNkzCQkJGjp0KHumjTr33HO1cOFCbdmyRZK0fv16LVu2TJdddpkk9gyOrzn7Y8WKFUpMTNSgQYP8a0aOHCm73a6VK1ee8plhPYcPH5bNZlNiYqKk03vPOEM9AI6tvLxcXq9XKSkpTY6npKTom2++CdFUsCqfz6c777xTw4cP15lnnilJKikpUWRkpP8vq++lpKSopKQkBFPCCt544w2tWbNGq1evDqixZ/BD27dv1+zZszVlyhTdf//9Wr16tW6//XZFRkZq/Pjx/n1xtH+r2DNt07333qvKykr16tVLDodDXq9XM2bM0NixYyWJPYPjas7+KCkpUceOHZvUnU6n2rdvzx6C6urqNHXqVN1www2Kj4+XdHrvGQI7ECZyc3P19ddfa9myZaEeBRa2Z88e3XHHHVqwYIHcbneox8FpwOfzadCgQXrsscckSf3799fXX3+tF198UePHjw/xdLCit956S3PnztXrr7+uPn36aN26dbrzzjuVlpbGngHQqhobG3XdddfJGKPZs2eHepwWwSXxFpacnCyHwxFwd+bS0lKlpqaGaCpY0eTJkzV//nwtXrxYnTt39h9PTU1VQ0ODKioqmqxnD7Vd+fn5Kisr04ABA+R0OuV0OrV06VI999xzcjqdSklJYc+giU6dOql3795NjuXk5Gj37t2S5N8X/FuF791999269957df3116tv3776xS9+obvuukszZ86UxJ7B8TVnf6SmpgbcgNnj8ejgwYPsoTbs+7C+a9cuLViwwH92XTq99wyB3cIiIyM1cOBALVy40H/M5/Np4cKFGjZsWAgng1UYYzR58mS99957WrRokbKysprUBw4cqIiIiCZ7qLCwULt372YPtVEjRozQxo0btW7dOv+PQYMGaezYsf5fs2fw74YPHx7wuMgtW7aoa9eukqSsrCylpqY22TOVlZVauXIle6aNqqmpkd3e9COmw+GQz+eTxJ7B8TVnfwwbNkwVFRXKz8/3r1m0aJF8Pp+GDh16ymdG6H0f1rdu3apPP/1USUlJTeqn9Z4J9V3vcHxvvPGGcblcZs6cOWbz5s1m0qRJJjEx0ZSUlIR6NFjAL3/5S5OQkGCWLFli9u3b5/9RU1PjX/Of//mfJiMjwyxatMh89dVXZtiwYWbYsGEhnBpW8+93iTeGPYOmVq1aZZxOp5kxY4bZunWrmTt3romOjjZ/+ctf/Gsef/xxk5iYaN5//32zYcMGc8UVV5isrCxTW1sbwskRKuPHjzfp6elm/vz5ZseOHeZvf/ubSU5ONvfcc49/DXumbTty5IhZu3atWbt2rZFknn76abN27Vr/Hb2bsz8uvfRS079/f7Ny5UqzbNky07NnT3PDDTeE6i2hlR1vzzQ0NJgxY8aYzp07m3Xr1jX5TFxfX+/vcbruGQL7aeD55583GRkZJjIy0gwZMsR8+eWXoR4JFiHpqD9effVV/5ra2lrzq1/9yrRr185ER0ebq666yuzbty90Q8NyfhjY2TP4oQ8++MCceeaZxuVymV69epk//OEPTeo+n89MmzbNpKSkGJfLZUaMGGEKCwtDNC1CrbKy0txxxx0mIyPDuN1u061bN/PAAw80+eDMnmnbFi9efNTPL+PHjzfGNG9/HDhwwNxwww0mNjbWxMfHm4kTJ5ojR46E4N3gVDjentmxY8cxPxMvXrzY3+N03TM2Y4w5defzAQAAAABAc/A97AAAAAAAWBCBHQAAAAAACyKwAwAAAABgQQR2AAAAAAAsiMAOAAAAAIAFEdgBAAAAALAgAjsAAAAAABZEYAcAAAAAwIII7AAAtBGZmZl69tlnQz0GAABoJgI7AAAWMWHCBNlsNj3++ONNjs+bN082my1EUzVls9n8P2JiYtSzZ09NmDBB+fn5oR4NAICwQ2AHAMBC3G63Zs2apUOHDoV6lGN69dVXtW/fPm3atEl5eXmqqqrS0KFD9dprr7X6793Y2NjqvwcAAFZBYAcAwEJGjhyp1NRUzZw587jr3n33XfXp00cul0uZmZl66qmnmtTLysp0+eWXKyoqSllZWZo7d25Aj4qKCt1yyy3q0KGD4uPjdfHFF2v9+vVBZ0xMTFRqaqoyMzN1ySWX6J133tHYsWM1efLkJv/RsGzZMp133nmKiopSly5ddPvtt6u6utpf37dvn0aPHu2f8fXXXw+4bN9ms2n27NkaM2aMYmJiNGPGDEnS+++/rwEDBsjtdqtbt256+OGH5fF4Tvq9AQBgJQR2AAAsxOFw6LHHHtPzzz+vvXv3HnVNfn6+rrvuOl1//fXauHGjHnroIU2bNk1z5szxr5kwYYL27NmjxYsX65133tHvf/97lZWVNelz7bXXqqysTB999JHy8/M1YMAAjRgxQgcPHjzhue+66y4dOXJECxYskCRt27ZNl156qa655hpt2LBBb775ppYtW6bJkyf7v+bGG29UcXGxlixZonfffVd/+MMfAmaUpIceekhXXXWVNm7cqJtuukmff/65brzxRt1xxx3avHmzXnrpJc2ZM8cf5lv6vQEAEDIGAABYwvjx480VV1xhjDHmnHPOMTfddJMxxpj33nvP/Ps/2T//+c/NT3/60yZfe/fdd5vevXsbY4wpLCw0ksyqVav89YKCAiPJPPPMM8YYYz7//HMTHx9v6urqmvTp3r27eemll445oyTz3nvvBRyvra01ksysWbOMMcbcfPPNZtKkSU3WfP7558Zut5va2lr/PKtXr/bXt27d2mTG73+/O++8s0mfESNGmMcee6zJsT//+c+mU6dOJ/XeAACwGmfo/qsAAAAcy6xZs3TxxRfrN7/5TUCtoKBAV1xxRZNjw4cP17PPPiuv16uCggI5nU4NHDjQX+/Vq5cSExP9r9evX6+qqiolJSU16VNbW6tt27ad8LzGGEny3xxv/fr12rBhQ5NL8Y0x8vl82rFjh7Zs2SKn06kBAwb46z169FC7du0Ceg8aNKjJ6/Xr12v58uVNzqh7vV7V1dWppqamxd8bAAChQmAHAMCCzj//fI0aNUr33XefJkyY0OL9q6qq1KlTJy1ZsiSg9u/BvrkKCgokSVlZWf7+t912m26//faAtRkZGdqyZUuze8fExDR5XVVVpYcfflhXX311wFq3293i7w0AgFAhsAMAYFGPP/64zj77bGVnZzc5npOTo+XLlzc5tnz5cp1xxhlyOBzq1auXPB6P8vPzNXjwYElSYWGhKioq/OsHDBigkpISOZ1OZWZmnvSszz77rOLj4zVy5Eh//82bN6tHjx5HXZ+dnS2Px6O1a9f6rwT49ttvm3V3/AEDBqiwsPCYvVv6vQEAECrcdA4AAIvq27evxo4dq+eee67J8V//+tdauHChHn30UW3ZskV/+tOf9MILL/gvn8/Oztall16q2267TStXrlR+fr5uueUWRUVF+XuMHDlSw4YN05VXXqlPPvlEO3fu1BdffKEHHnhAX3311XHnqqioUElJiXbt2qUFCxboZz/7mV5//XXNnj3bfwZ76tSp+uKLLzR58mStW7dOW7du1fvvv++/6VyvXr00cuRITZo0SatWrdLatWs1adIkRUVFBX3m/PTp0/Xaa6/p4Ycf1qZNm1RQUKA33nhDv/3tb0/6vQEAYCUEdgAALOyRRx6Rz+drcmzAgAF666239MYbb+jMM8/U9OnT9cgjjzS5dP7VV19VWlqaLrjgAl199dWaNGmSOnbs6K/bbDb94x//0Pnnn6+JEyfqjDPO0PXXX69du3YpJSXluDNNnDhRnTp1Uq9evfTLX/5SsbGxWrVqlX7+85/715x11llaunSptmzZovPOO0/9+/fX9OnTlZaW5l/z2muvKSUlReeff76uuuoq3XrrrYqLi5Pb7T7u7z9q1CjNnz9fn3zyiQYPHqxzzjlHzzzzjLp27XrS7w0AACuxme/vEgMAABBCe/fuVZcuXfTpp59qxIgRoR4HAICQI7ADAICQWLRokaqqqtS3b1/t27dP99xzj4qKirRlyxZFRESEejwAAEKOm84BAICQaGxs1P3336/t27crLi5O5557rubOnUtYBwDgf3GGHQAAAAAAC+KmcwAAAAAAWBCBHQAAAAAACyKwAwAAAABgQQR2AAAAAAAsiMAOAAAAAIAFEdgBAAAAALAgAjsAAAAAABZEYAcAAAAAwIL+P2t48E3R4eVIAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 1200x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "degree_dist_df = db_query(\n",
    "    \"\"\"\n",
    "MATCH (e:__Entity__)\n",
    "RETURN count {(e)-[:RELATED]-()} AS node_degree\n",
    "\"\"\"\n",
    ")\n",
    "# Calculate mean and median\n",
    "mean_degree = np.mean(degree_dist_df[\"node_degree\"])\n",
    "percentiles = np.percentile(degree_dist_df[\"node_degree\"], [25, 50, 75, 90])\n",
    "# Create a histogram with a logarithmic scale\n",
    "plt.figure(figsize=(12, 6))\n",
    "sns.histplot(degree_dist_df[\"node_degree\"], bins=50, kde=False, color=\"blue\")\n",
    "# Use a logarithmic scale for the x-axis\n",
    "plt.yscale(\"log\")\n",
    "# Adding labels and title\n",
    "plt.xlabel(\"Node Degree\")\n",
    "plt.ylabel(\"Count (log scale)\")\n",
    "plt.title(\"Node Degree Distribution\")\n",
    "# Add mean, median, and percentile lines\n",
    "plt.axvline(\n",
    "    mean_degree,\n",
    "    color=\"red\",\n",
    "    linestyle=\"dashed\",\n",
    "    linewidth=1,\n",
    "    label=f\"Mean: {mean_degree:.2f}\",\n",
    ")\n",
    "plt.axvline(\n",
    "    percentiles[0],\n",
    "    color=\"purple\",\n",
    "    linestyle=\"dashed\",\n",
    "    linewidth=1,\n",
    "    label=f\"25th Percentile: {percentiles[0]:.2f}\",\n",
    ")\n",
    "plt.axvline(\n",
    "    percentiles[1],\n",
    "    color=\"orange\",\n",
    "    linestyle=\"dashed\",\n",
    "    linewidth=1,\n",
    "    label=f\"50th Percentile: {percentiles[1]:.2f}\",\n",
    ")\n",
    "plt.axvline(\n",
    "    percentiles[2],\n",
    "    color=\"yellow\",\n",
    "    linestyle=\"dashed\",\n",
    "    linewidth=1,\n",
    "    label=f\"75th Percentile: {percentiles[2]:.2f}\",\n",
    ")\n",
    "plt.axvline(\n",
    "    percentiles[3],\n",
    "    color=\"brown\",\n",
    "    linestyle=\"dashed\",\n",
    "    linewidth=1,\n",
    "    label=f\"90th Percentile: {percentiles[3]:.2f}\",\n",
    ")\n",
    "# Add legend\n",
    "plt.legend()\n",
    "# Show the plot\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "10f727be-63c5-4283-b2b7-5d934aca5fa9",
   "metadata": {},
   "source": [
    "Most real-world networks follow a power-law node degree distribution, with most nodes having relatively small degrees and some important nodes having a lot. While our graph is small, the node degree follows the power law. It would be interesting to identify which entity has 120 relationships (connected to 43% of entities)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "a0c0fe31-88a7-4d1f-bd3d-255e5d379afe",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>name</th>\n",
       "      <th>degree</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>SCROOGE</td>\n",
       "      <td>120</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>MRS. CRATCHIT</td>\n",
       "      <td>16</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>BOB CRATCHIT</td>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>PROJECT GUTENBERG</td>\n",
       "      <td>13</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>EBENEZER SCROOGE</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                name  degree\n",
       "0            SCROOGE     120\n",
       "1      MRS. CRATCHIT      16\n",
       "2       BOB CRATCHIT      14\n",
       "3  PROJECT GUTENBERG      13\n",
       "4   EBENEZER SCROOGE      12"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "db_query(\n",
    "    \"\"\"\n",
    "  MATCH (n:__Entity__) \n",
    "  RETURN n.name AS name, count{(n)-[:RELATED]-()} AS degree\n",
    "  ORDER BY degree DESC LIMIT 5\"\"\"\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5404d06f-410c-4867-a9b3-13c5d0305d98",
   "metadata": {},
   "source": [
    "Without any hesitation, we can assume that `Scrooge` is the book's main character. I would also venture a guess that `Ebenezer Scrooge` and `Scrooge` are actually the same entity, but as the MSFT GraphRAG lacks an entity resolution step, they weren't merged.\n",
    "It also shows that analyzing and cleaning the data is a vital step to reducing noise information, as Project Gutenberg has 13 relationships, even though they are not part of the book story.\n",
    "\n",
    "Lastly, we'll inspect the distribution of community size per hierarchical level."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "3795c759-c98f-4fd1-a5ef-690b8a469559",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/var/folders/87/hnv4nyfj1bl8h65l0mp7xrx40000gp/T/ipykernel_29432/2680507823.py:23: FutureWarning: \n",
      "\n",
      "Passing `palette` without assigning `hue` is deprecated and will be removed in v0.14.0. Assign the `x` variable to `hue` and set `legend=False` for the same effect.\n",
      "\n",
      "  sns.boxplot(x=\"level\", y=\"members\", data=community_data, palette=\"viridis\")\n"
     ]
    },
    {
     "data": {
      "image/png": "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UmFhoU6ePKmuXbvKZrM5+tSsWVOpqamKioo67/b++KtPrVq1lJub6/T6DRo0cKrFy8tLhw4d0sGDB5WVlaXg4GBHuzFGRUVFjuf+/v5O2x82bJjS09M1duxYpaamqnfv3nr66actXZ/w3XffqVevXnruued03XXXOZZPmzZNJ06c0P/93/+psLBQ9913n95//32FhIRIkhYsWKD77rtPrVu3lqenp+6//3599tlnjnagLDAOVMw4IEk+Pj4aOnSoWrRooZiYGHXp0qXE6+7bt0+JiYn65z//aek1gZJgHKi4ceBicnNz9fbbb+uNN95wWj5r1ix99NFH+umnn9SwYUNt2rRJAwYM0GeffabY2Ngye/3qjlP7UGIHDx7UiBEjNG/ePB0+fFhZWVm68cYbnU4lK28hISGqVauWkpOTlZWV5XicPn1anTp1KvV2Dxw44Pj78OHDys/PV926dRUVFaU6deo4vVZ2drbTwGu3O3+MPD099dBDD+nbb7/VDz/8oIMHD2rmzJklruW7775TfHy85s6d6zSRhCR5e3tr/vz5OnDggNLS0nTjjTeqoKBAHTp0kCTVrl1bS5Ys0aFDh3TgwAE1adJE4eHhatasWWneFuAcjAMVMw78r8LCQsun6C5evFjt27fnVB6UOcYB14wD5/Pmm28qICBAvXr1clq+fft23XbbbWrcuLHsdruuvfZatW7dWp999lmZvn51R5BCieXm5soYozp16shut+ujjz6q8Kk07Xa7xo4dq/vuu0+pqamSpGPHjumtt966pO2++OKL2r17t06fPq0HH3xQXbt2Vb169XT11VcrKipK06dP14kTJ2SM0YEDB/Txxx9fcFvr169XSkqKzpw5I19fX3l7ezuucfozu3btUnx8vGbPnq2RI0ee056enq4DBw7IGKM9e/Zo1KhRmjx5suMXsn379ikzM1PGGG3fvl333nuvZs6cec7gDpQW40D5jwOrV6/Wjh07dObMGZ06dUpz5szRr7/+qq5du0r6/VfwvLw8x0Xu+fn5ysvLc/oSW1RUpKVLlzLJBMoF40D5jwPS75PF5OXlSZIKCgqUl5fnuDb6rMWLF+vOO++Uh4eH0/K4uDj9+9//dnxn2LJli7788kuORpUxvl2hxJo3b66HH35Y3bt3V0hIiN566y317t27wuuYO3eu4uLi1L17d/n7+6td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//79SktLU0JCwgW3t2PHDvXt21dTpkzR8ePHtW/fPg0YMMDR/sfvC7m5ubriiis0aNCg8txFlCUDk52dbSSZ7OxsV5dSbf397383TZo0MX5+fqZRo0bm2WefdbT17t3bzJw506n/2LFjzZgxY4wxxvz2229mwIABJjAw0DRr1sw888wzpjT/tPft22ckmd9++81p+SuvvGJat25teXvGGHP69GlTu3Zt8+abbzotz8nJMU2bNjU//fSTkWS2b99equ0DVY07jwXGWP/sHjx40DRq1Mh8/fXXF9zmo48+am699VbLdQJVlTuMA2e9//77JioqyvH8sssuM+vWrXM837Bhg/H29janTp067/oDBgww06ZNK9FrJScnGw8PD3Po0KFS14uyUdJswBEpuIUGDRpo/fr1ysnJ0csvv6wpU6Zoy5YtkqRhw4bp9ddfd/QtKCjQ22+/reHDh0uSJk6cqJMnT+rAgQNKTEzUa6+95rTtFStWXPJh8t27d6tOnTpq2LChxo0bd9FTfv7ovffek91uV9++fZ2WT5s2TcOGDVPTpk0vqS6gqnH3scDqZ/eee+7R3/72N4WEhFzS6wLViTuNAxs3bnTqX1xcLGOM0/O8vDzt2bPngusXFBQoNjZWl112mW644Qbt3r37vH0XL16sXr16KTIyssT1wcUqJte5N45IuZ9bb73VzJ492xhjTF5enqldu7bZunWrMcaYlStXmsaNGxtjjDlz5oypUaOG+eqrrxzrvv3222X6K/TevXvNnj17TFFRkfnll19Mjx49TO/evUu0ze7du5uEhASnZVu2bDEtWrQw+fn5xhjDESngItxpLLD62V2xYoXp0aPHRbdpDEekgD/jinHAGGM++ugjExAQYHbs2OFYNnz4cNOjRw9z5MgRc+TIERMfH28kmc2bN593Gx4eHqZu3brmu+++M3l5eeaBBx4wzZo1M4WFhU79cnNzTUBAgFm1alWpakXZ4ogUKpXly5erbdu2Cg4OVlBQkD766CPH5AxeXl4aOHCgXn31VUnSq6++qmHDhkmSjh49qsLCQkVFRTm2Vb9+/TKtrVGjRmrSpInsdrsaNmyoZ555RqtXr/7Ti0v37dunxMREjRo1yrGsoKBAY8aM0QsvvKCaNWuWaZ1AVeCuY4HVz+7x48c1depUvfDCC2VWA1BduMM4sH79eg0dOlQrV65Uq1atHMsXLFig+vXrq3Xr1mrXrp169+4tSRc86uzn56eRI0eqZcuW8vLy0qxZs/Tzzz/rp59+cur3zjvvqFatWrrppptKVS9cgyAFlzt48KBGjBihefPm6fDhw8rKytKNN97odOh82LBheuutt5SRkaGPP/7YMWiGhoaqRo0aSk1NddpeebLbf//Y/LG+81m8eLHat2+vli1bOpalpaXphx9+UN++fRUaGuqYgKJbt26aP39++RUNVALuPBZY/ezu2LFDaWlpiouLU2hoqNq2bStJaty4sf7973+XWV1AVeMO48D69es1YMAArVixQj169HBqq127tpYsWaJDhw7pwIEDatKkicLDw9WsWbPzbqt169ZOz20223n7vfzyyxoxYoQ8PT0t1wsXqoCjY26PU/tca9euXcZut5tvv/3WFBUVmQ8//ND4+PiYSZMmOfVr3Lix6dmzp+ncubPT8iFDhpibbrrJZGVlmfT0dNOhQwdLh/GLi4vN6dOnzY8//mgkmYyMDHP69GlTXFxsjDHmww8/NGlpacYYY1JTU831119vbrzxxotu88yZM6Zu3brmpZdeOmd5amqq00OS+eSTT0xOTk6JawaqInceC6x+dvPy8pz6bt261Ugyu3btMidPnjTGGFNYWGhOnz5tHn74YXPLLbeY06dPO04bBKorV48DiYmJJigoyKxevfq87b/88ovJyMgwxcXFZtu2baZZs2bmxRdfvOD2Xn/9dVOvXj3z448/moKCAvPQQw+ZmJgYp1P7fvzxR2Oz2cxPP/1U4jpRvkqaDQhShiDlDh555BETEhJigoKCzPDhw83tt99+zqD5t7/9zUg6Z8A6fvy46devnwkICDDNmjUzf//7303NmjUd7a+//rpp3rz5BV/77LUL//vYt2+fMcaY+++/34SFhRkfHx9Tr149M3bsWHPs2LGLbv/DDz80vr6+JQpH4hopwMGdx4L/9b+f3ccff9zccMMNF932H6+RevTRR895rWuuueaC9QHVhSvHgWuvvdbY7Xbj6+vr9DjrvffeM3Xr1jU+Pj6madOm5l//+pfT+ucbB5544gkTERFhgoKCzPXXX39OYJoyZYrp2rVrid4bVIySZgObMX9yflI1kJOTo8DAQGVnZysgIMDV5eASvfHGG5oxY8YFZ9ABUD0wFgBgHEBplDQbcI0UKr09e/bo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",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "community_data = db_query(\n",
    "    \"\"\"\n",
    "  MATCH (n:__Community__)\n",
    "  RETURN n.level AS level, count{(n)-[:IN_COMMUNITY]-()} AS members\n",
    "\"\"\"\n",
    ")\n",
    "\n",
    "stats = (\n",
    "    community_data.groupby(\"level\")\n",
    "    .agg(\n",
    "        min_members=(\"members\", \"min\"),\n",
    "        max_members=(\"members\", \"max\"),\n",
    "        median_members=(\"members\", \"median\"),\n",
    "        avg_members=(\"members\", \"mean\"),\n",
    "        num_communities=(\"members\", \"count\"),\n",
    "        total_members=(\"members\", \"sum\"),\n",
    "    )\n",
    "    .reset_index()\n",
    ")\n",
    "\n",
    "# Create box plot\n",
    "plt.figure(figsize=(10, 6))\n",
    "sns.boxplot(x=\"level\", y=\"members\", data=community_data, palette=\"viridis\")\n",
    "plt.xlabel(\"Level\")\n",
    "plt.ylabel(\"Members\")\n",
    "\n",
    "# Add statistical annotations\n",
    "for i in range(stats.shape[0]):\n",
    "    level = stats[\"level\"][i]\n",
    "    max_val = stats[\"max_members\"][i]\n",
    "    text = (\n",
    "        f\"num: {stats['num_communities'][i]}\\n\"\n",
    "        f\"all_members: {stats['total_members'][i]}\\n\"\n",
    "        f\"min: {stats['min_members'][i]}\\n\"\n",
    "        f\"max: {stats['max_members'][i]}\\n\"\n",
    "        f\"med: {stats['median_members'][i]}\\n\"\n",
    "        f\"avg: {stats['avg_members'][i]:.2f}\"\n",
    "    )\n",
    "    plt.text(level, 85, text, horizontalalignment=\"center\", fontsize=9)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8385cc7e-d36f-4b12-b90e-1d2d7f2b6096",
   "metadata": {},
   "source": [
    "The Leiden algorithm identified three levels of communities, where the communities on higher levels are larger on average. However, there are some technical details that I'm not aware of because if you check the all_members count, and you can see that each level has a different number of all nodes, even though they should be the same in theory. Also, if communities merge at higher levels, why do we have 19 communities on level 0 and 22 on level 1? The authors have done some optimizations and tricks here, which I haven't had a time to explore in detail yet.\n",
    "## Implementing retrievers\n",
    "In the last part of this blog post, we will discuss the local and global retrievers as specified in the MSFT GraphRAG. The retrievers will be implemented and integrated with LangChain and LlamaIndex.\n",
    "### Local retriever\n",
    "The local retriever starts by using vector search to identify relevant nodes, and then collects linked information and injects it into the LLM prompt.\n",
    "\n",
    "![image](https://cdn-images-1.medium.com/max/800/1*lInV6WWTDXYEVI1NS3KV9g.png)\n",
    "\n",
    "While this diagram might look complex, it can be easily implemented. We start by identifying relevant entities using a vector similarity search based on text embeddings of entity descriptions. Once the relevant entities are identified, we can traverse to related text chunks, relationships, community summaries, and so on. The pattern of using vector similarity search and then traversing throughout the graph can easily be implemented using a retrieval_query feature in both LangChain and LlamaIndex.\n",
    "\n",
    "First, we need to configure the vector index."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "1b1ec651-aad5-4642-b8b5-fc4712f42630",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "Empty DataFrame\n",
       "Columns: []\n",
       "Index: []"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "index_name = \"entity\"\n",
    "\n",
    "db_query(\n",
    "    \"\"\"\n",
    "CREATE VECTOR INDEX \"\"\"\n",
    "    + index_name\n",
    "    + \"\"\" IF NOT EXISTS FOR (e:__Entity__) ON e.description_embedding\n",
    "OPTIONS {indexConfig: {\n",
    " `vector.dimensions`: 1536,\n",
    " `vector.similarity_function`: 'cosine'\n",
    "}}\n",
    "\"\"\"\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e7a90671-ed42-40c3-a920-ea2ed822c2ba",
   "metadata": {},
   "source": [
    "We'll also calculate and store the community weight, which is defined as the number of distinct text chunks the entities in the community appear."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "633005e0-3b14-4cbc-8990-606cb2717fc6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "Empty DataFrame\n",
       "Columns: []\n",
       "Index: []"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "db_query(\n",
    "    \"\"\"\n",
    "MATCH (n:`__Community__`)<-[:IN_COMMUNITY]-()<-[:HAS_ENTITY]-(c)\n",
    "WITH n, count(distinct c) AS chunkCount\n",
    "SET n.weight = chunkCount\"\"\"\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "322a608e-0b73-42ba-845e-73a6b649757d",
   "metadata": {},
   "source": [
    "The number of candidates (text units, community reports, …) from each section is configurable. While the original implementation has slightly more involved filtering based on token counts, we'll simplify it here. I developed the following simplified top candidate filter values based on the default configuration values."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "b28d3841-a88f-407b-ba68-23a702c3248c",
   "metadata": {},
   "outputs": [],
   "source": [
    "topChunks = 3\n",
    "topCommunities = 3\n",
    "topOutsideRels = 10\n",
    "topInsideRels = 10\n",
    "topEntities = 10"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5fa3fde7-b2ad-4cb8-996c-93ebd8e41583",
   "metadata": {},
   "source": [
    "We will start with LangChain implementation. The only thing we need to define is the retrieval_query , which is more involved."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "c3df7c79-660e-4114-8427-7a436295e109",
   "metadata": {},
   "outputs": [],
   "source": [
    "lc_retrieval_query = \"\"\"\n",
    "WITH collect(node) as nodes\n",
    "// Entity - Text Unit Mapping\n",
    "WITH\n",
    "collect {\n",
    "    UNWIND nodes as n\n",
    "    MATCH (n)<-[:HAS_ENTITY]->(c:__Chunk__)\n",
    "    WITH c, count(distinct n) as freq\n",
    "    RETURN c.text AS chunkText\n",
    "    ORDER BY freq DESC\n",
    "    LIMIT $topChunks\n",
    "} AS text_mapping,\n",
    "// Entity - Report Mapping\n",
    "collect {\n",
    "    UNWIND nodes as n\n",
    "    MATCH (n)-[:IN_COMMUNITY]->(c:__Community__)\n",
    "    WITH c, c.rank as rank, c.weight AS weight\n",
    "    RETURN c.summary \n",
    "    ORDER BY rank, weight DESC\n",
    "    LIMIT $topCommunities\n",
    "} AS report_mapping,\n",
    "// Outside Relationships \n",
    "collect {\n",
    "    UNWIND nodes as n\n",
    "    MATCH (n)-[r:RELATED]-(m) \n",
    "    WHERE NOT m IN nodes\n",
    "    RETURN r.description AS descriptionText\n",
    "    ORDER BY r.rank, r.weight DESC \n",
    "    LIMIT $topOutsideRels\n",
    "} as outsideRels,\n",
    "// Inside Relationships \n",
    "collect {\n",
    "    UNWIND nodes as n\n",
    "    MATCH (n)-[r:RELATED]-(m) \n",
    "    WHERE m IN nodes\n",
    "    RETURN r.description AS descriptionText\n",
    "    ORDER BY r.rank, r.weight DESC \n",
    "    LIMIT $topInsideRels\n",
    "} as insideRels,\n",
    "// Entities description\n",
    "collect {\n",
    "    UNWIND nodes as n\n",
    "    RETURN n.description AS descriptionText\n",
    "} as entities\n",
    "// We don't have covariates or claims here\n",
    "RETURN {Chunks: text_mapping, Reports: report_mapping, \n",
    "       Relationships: outsideRels + insideRels, \n",
    "       Entities: entities} AS text, 1.0 AS score, {} AS metadata\n",
    "\"\"\"\n",
    "\n",
    "lc_vector = Neo4jVector.from_existing_index(\n",
    "    OpenAIEmbeddings(model=\"text-embedding-3-small\"),\n",
    "    url=NEO4J_URI,\n",
    "    username=NEO4J_USERNAME,\n",
    "    password=NEO4J_PASSWORD,\n",
    "    index_name=index_name,\n",
    "    retrieval_query=lc_retrieval_query,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4aae8ac7-b1dd-4778-9fdf-476b687ef4b6",
   "metadata": {},
   "source": [
    "This Cypher query performs multiple analytical operations on a set of nodes to extract and organize related text data:\n",
    "1. Entity-Text Unit Mapping: For each node, the query identifies linked text chunks (`__Chunk__`), aggregates them by the number of distinct nodes associated with each chunk, and orders them by frequency. The top chunks are returned as `text_mapping`.\n",
    "2. Entity-Report Mapping: For each node, the query finds the associated community (`__Community__`), and returns the summary of the top-ranked communities based on rank and weight.\n",
    "3. Outside Relationships: This section extracts descriptions of relationships (`RELATED`) where the related entity (`m`) is not part of the initial node set. The relationships are ranked and limited to the top external relationships.\n",
    "4. Inside Relationships: Similarly to outside relationships, but this time it considers only relationships where both entities are within the initial set of nodes.\n",
    "5. Entities Description: Simply collects descriptions of each node in the initial set.\n",
    "Finally, the query combines the collected data into a structured result comprising of chunks, reports, internal and external relationships, and entity descriptions, along with a default score and an empty metadata object. You have the option to remove some of the retrieval parts to test how they affect the results.\n",
    "\n",
    "And now you can run the retriever using the following code:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "51ee7acf-00b5-4edc-9665-c17e8ccf4ee5",
   "metadata": {},
   "outputs": [],
   "source": [
    "docs = lc_vector.similarity_search(\n",
    "    \"What do you know about Cratchitt family?\",\n",
    "    k=topEntities,\n",
    "    params={\n",
    "        \"topChunks\": topChunks,\n",
    "        \"topCommunities\": topCommunities,\n",
    "        \"topOutsideRels\": topOutsideRels,\n",
    "        \"topInsideRels\": topInsideRels,\n",
    "    },\n",
    ")\n",
    "# print(docs[0].page_content)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4740238b-d749-4653-ad7d-b3947463c123",
   "metadata": {},
   "source": [
    "The same retrieval pattern can be implemented with LlamaIndex. For LlamaIndex, we first need to add metadata to nodes so that the vector index will work. If the default metadata is not added to the relevant nodes, the vector index will return an error."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "eb29ce7e-2630-451d-a42d-1df6b8f3e015",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "Empty DataFrame\n",
       "Columns: []\n",
       "Index: []"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "content = node_to_metadata_dict(TextNode(), remove_text=True, flat_metadata=False)\n",
    "\n",
    "db_query(\n",
    "    \"\"\"\n",
    "  MATCH (e:__Entity__)\n",
    "  SET e += $content\"\"\",\n",
    "    {\"content\": content},\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b0c698a9-5b6f-4367-950b-1f3f90cae0c3",
   "metadata": {},
   "source": [
    "Again, we can use the `retrieval_query` feature in LlamaIndex to define the retriever. Unlike with LangChain, we will use the f-string instead of query parameters to pass the top candidate filter parameters."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "4aa8faaf-4d6e-4692-9bff-ebd031b56580",
   "metadata": {},
   "outputs": [],
   "source": [
    "embed_dim = 1536\n",
    "\n",
    "retrieval_query = f\"\"\"\n",
    "WITH collect(node) as nodes\n",
    "// Entity - Text Unit Mapping\n",
    "WITH\n",
    "nodes,\n",
    "collect {{\n",
    "    UNWIND nodes as n\n",
    "    MATCH (n)<-[:HAS_ENTITY]->(c:__Chunk__)\n",
    "    WITH c, count(distinct n) as freq\n",
    "    RETURN c.text AS chunkText\n",
    "    ORDER BY freq DESC\n",
    "    LIMIT {topChunks}\n",
    "}} AS text_mapping,\n",
    "// Entity - Report Mapping\n",
    "collect {{\n",
    "    UNWIND nodes as n\n",
    "    MATCH (n)-[:IN_COMMUNITY]->(c:__Community__)\n",
    "    WITH c, c.rank as rank, c.weight AS weight\n",
    "    RETURN c.summary \n",
    "    ORDER BY rank, weight DESC\n",
    "    LIMIT {topCommunities}\n",
    "}} AS report_mapping,\n",
    "// Outside Relationships \n",
    "collect {{\n",
    "    UNWIND nodes as n\n",
    "    MATCH (n)-[r:RELATED]-(m) \n",
    "    WHERE NOT m IN nodes\n",
    "    RETURN r.description AS descriptionText\n",
    "    ORDER BY r.rank, r.weight DESC \n",
    "    LIMIT {topOutsideRels}\n",
    "}} as outsideRels,\n",
    "// Inside Relationships \n",
    "collect {{\n",
    "    UNWIND nodes as n\n",
    "    MATCH (n)-[r:RELATED]-(m) \n",
    "    WHERE m IN nodes\n",
    "    RETURN r.description AS descriptionText\n",
    "    ORDER BY r.rank, r.weight DESC \n",
    "    LIMIT {topInsideRels}\n",
    "}} as insideRels,\n",
    "// Entities description\n",
    "collect {{\n",
    "    UNWIND nodes as n\n",
    "    RETURN n.description AS descriptionText\n",
    "}} as entities\n",
    "// We don't have covariates or claims here\n",
    "RETURN \"Chunks:\" + apoc.text.join(text_mapping, '|') + \"\\nReports: \" + apoc.text.join(report_mapping,'|') +  \n",
    "       \"\\nRelationships: \" + apoc.text.join(outsideRels + insideRels, '|') + \n",
    "       \"\\nEntities: \" + apoc.text.join(entities, \"|\") AS text, 1.0 AS score, nodes[0].id AS id, \n",
    "       {{_node_type:nodes[0]._node_type, _node_content:nodes[0]._node_content}} AS metadata\n",
    "\"\"\""
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b634a7df-a3e7-4ed7-8115-0524cb06f1c0",
   "metadata": {},
   "source": [
    "Additionally, the return is slightly different. We need to return the node type and content as metadata; otherwise, the retriever will break. Now we just instantiate the Neo4j vector store and use it as a query engine."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "d0c9a177-00ea-4fb1-9087-9d353dd845e2",
   "metadata": {},
   "outputs": [],
   "source": [
    "from llama_index.embeddings.openai import OpenAIEmbedding\n",
    "\n",
    "neo4j_vector = Neo4jVectorStore(\n",
    "    NEO4J_USERNAME,\n",
    "    NEO4J_PASSWORD,\n",
    "    NEO4J_URI,\n",
    "    embed_dim,\n",
    "    index_name=index_name,\n",
    "    retrieval_query=retrieval_query,\n",
    ")\n",
    "loaded_index = VectorStoreIndex.from_vector_store(neo4j_vector).as_query_engine(\n",
    "    similarity_top_k=topEntities, embed_model=OpenAIEmbedding(model=\"text-embedding-3-small\")\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "06cdf5d9-7348-42ec-8cf3-a52f75f1871b",
   "metadata": {},
   "source": [
    "We can now test the GraphRAG local retriever."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "c43b3f7e-dfad-4d5c-b889-8e913f86ce31",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Scrooge is an employee who is impacted by the generosity and festive spirit of the Fezziwig family, particularly Mr. and Mrs. Fezziwig. He is involved in the memorable Domestic Ball hosted by the Fezziwigs, which significantly influences his life and contributes to the broader narrative of kindness and community spirit.\n"
     ]
    }
   ],
   "source": [
    "response = loaded_index.query(\"What do you know about Scrooge?\")\n",
    "print(response.response)\n",
    "# print(response.source_nodes[0].text)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ae5c66a1-d8d0-406d-a3f2-da75ea24774a",
   "metadata": {},
   "source": [
    "One thing that immediately sparks to mind is that we can improve the local retrieval by using a hybrid approach (vector + keyword) to find relevant entities instead of vector search only.\n",
    "## Global retriever\n",
    "The global retriever architecture is slightly more straightforward. It seems to iterate over all the community summaries on a specified hierarchical level, producing intermediate summaries and then generating a final response based on the intermediate summaries.\n",
    "\n",
    "![image](https://cdn-images-1.medium.com/max/800/1*mcDNDMTmCqVAUv1SnzTtzA.png)\n",
    "\n",
    "We have to decide which define in advance which hierarchical level we want to iterate over, which is a not a simple decision as we have no idea which one would work better. The higher up you go the hierarchical level, the larger the communities get, but there are fewer of them. This is the only information we have without inspecting summaries manually.\n",
    "Other parameters allow us to ignore communities below a rank or weight threshold, which we won't use here. We'll implement the global retriever using LangChain as use the same map and reduce prompts as in the GraphRAG paper."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "aeba3a86-0465-491c-bdd8-9b1e5680b2f3",
   "metadata": {},
   "outputs": [],
   "source": [
    "llm = ChatOpenAI(model=\"gpt-4o-mini\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "01cfb6ba-c615-4297-8d5c-6508e6369e4d",
   "metadata": {},
   "outputs": [],
   "source": [
    "MAP_SYSTEM_PROMPT = \"\"\"\n",
    "---Role---\n",
    "\n",
    "You are a helpful assistant responding to questions about data in the tables provided.\n",
    "\n",
    "\n",
    "---Goal---\n",
    "\n",
    "Generate a response consisting of a list of key points that responds to the user's question, summarizing all relevant information in the input data tables.\n",
    "\n",
    "You should use the data provided in the data tables below as the primary context for generating the response.\n",
    "If you don't know the answer or if the input data tables do not contain sufficient information to provide an answer, just say so. Do not make anything up.\n",
    "\n",
    "Each key point in the response should have the following element:\n",
    "- Description: A comprehensive description of the point.\n",
    "- Importance Score: An integer score between 0-100 that indicates how important the point is in answering the user's question. An 'I don't know' type of response should have a score of 0.\n",
    "\n",
    "The response should be JSON formatted as follows:\n",
    "{{\n",
    "    \"points\": [\n",
    "        {{\"description\": \"Description of point 1 [Data: Reports (report ids)]\", \"score\": score_value}},\n",
    "        {{\"description\": \"Description of point 2 [Data: Reports (report ids)]\", \"score\": score_value}}\n",
    "    ]\n",
    "}}\n",
    "\n",
    "The response shall preserve the original meaning and use of modal verbs such as \"shall\", \"may\" or \"will\".\n",
    "\n",
    "Points supported by data should list the relevant reports as references as follows:\n",
    "\"This is an example sentence supported by data references [Data: Reports (report ids)]\"\n",
    "\n",
    "**Do not list more than 5 record ids in a single reference**. Instead, list the top 5 most relevant record ids and add \"+more\" to indicate that there are more.\n",
    "\n",
    "For example:\n",
    "\"Person X is the owner of Company Y and subject to many allegations of wrongdoing [Data: Reports (2, 7, 64, 46, 34, +more)]. He is also CEO of company X [Data: Reports (1, 3)]\"\n",
    "\n",
    "where 1, 2, 3, 7, 34, 46, and 64 represent the id (not the index) of the relevant data report in the provided tables.\n",
    "\n",
    "Do not include information where the supporting evidence for it is not provided.\n",
    "\n",
    "\n",
    "---Data tables---\n",
    "\n",
    "{context_data}\n",
    "\n",
    "---Goal---\n",
    "\n",
    "Generate a response consisting of a list of key points that responds to the user's question, summarizing all relevant information in the input data tables.\n",
    "\n",
    "You should use the data provided in the data tables below as the primary context for generating the response.\n",
    "If you don't know the answer or if the input data tables do not contain sufficient information to provide an answer, just say so. Do not make anything up.\n",
    "\n",
    "Each key point in the response should have the following element:\n",
    "- Description: A comprehensive description of the point.\n",
    "- Importance Score: An integer score between 0-100 that indicates how important the point is in answering the user's question. An 'I don't know' type of response should have a score of 0.\n",
    "\n",
    "The response shall preserve the original meaning and use of modal verbs such as \"shall\", \"may\" or \"will\".\n",
    "\n",
    "Points supported by data should list the relevant reports as references as follows:\n",
    "\"This is an example sentence supported by data references [Data: Reports (report ids)]\"\n",
    "\n",
    "**Do not list more than 5 record ids in a single reference**. Instead, list the top 5 most relevant record ids and add \"+more\" to indicate that there are more.\n",
    "\n",
    "For example:\n",
    "\"Person X is the owner of Company Y and subject to many allegations of wrongdoing [Data: Reports (2, 7, 64, 46, 34, +more)]. He is also CEO of company X [Data: Reports (1, 3)]\"\n",
    "\n",
    "where 1, 2, 3, 7, 34, 46, and 64 represent the id (not the index) of the relevant data report in the provided tables.\n",
    "\n",
    "Do not include information where the supporting evidence for it is not provided.\n",
    "\n",
    "The response should be JSON formatted as follows:\n",
    "{{\n",
    "    \"points\": [\n",
    "        {{\"description\": \"Description of point 1 [Data: Reports (report ids)]\", \"score\": score_value}},\n",
    "        {{\"description\": \"Description of point 2 [Data: Reports (report ids)]\", \"score\": score_value}}\n",
    "    ]\n",
    "}}\n",
    "\"\"\"\n",
    "\n",
    "map_prompt = ChatPromptTemplate.from_messages(\n",
    "    [\n",
    "        (\n",
    "            \"system\",\n",
    "            MAP_SYSTEM_PROMPT,\n",
    "        ),\n",
    "        (\n",
    "            \"human\",\n",
    "            \"{question}\",\n",
    "        ),\n",
    "    ]\n",
    ")\n",
    "\n",
    "map_chain = map_prompt | llm | StrOutputParser()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "82232a30-f697-4eff-ae1e-fc1e6441c926",
   "metadata": {},
   "outputs": [],
   "source": [
    "REDUCE_SYSTEM_PROMPT = \"\"\"\n",
    "---Role---\n",
    "\n",
    "You are a helpful assistant responding to questions about a dataset by synthesizing perspectives from multiple analysts.\n",
    "\n",
    "\n",
    "---Goal---\n",
    "\n",
    "Generate a response of the target length and format that responds to the user's question, summarize all the reports from multiple analysts who focused on different parts of the dataset.\n",
    "\n",
    "Note that the analysts' reports provided below are ranked in the **descending order of importance**.\n",
    "\n",
    "If you don't know the answer or if the provided reports do not contain sufficient information to provide an answer, just say so. Do not make anything up.\n",
    "\n",
    "The final response should remove all irrelevant information from the analysts' reports and merge the cleaned information into a comprehensive answer that provides explanations of all the key points and implications appropriate for the response length and format.\n",
    "\n",
    "Add sections and commentary to the response as appropriate for the length and format. Style the response in markdown.\n",
    "\n",
    "The response shall preserve the original meaning and use of modal verbs such as \"shall\", \"may\" or \"will\".\n",
    "\n",
    "The response should also preserve all the data references previously included in the analysts' reports, but do not mention the roles of multiple analysts in the analysis process.\n",
    "\n",
    "**Do not list more than 5 record ids in a single reference**. Instead, list the top 5 most relevant record ids and add \"+more\" to indicate that there are more.\n",
    "\n",
    "For example:\n",
    "\n",
    "\"Person X is the owner of Company Y and subject to many allegations of wrongdoing [Data: Reports (2, 7, 34, 46, 64, +more)]. He is also CEO of company X [Data: Reports (1, 3)]\"\n",
    "\n",
    "where 1, 2, 3, 7, 34, 46, and 64 represent the id (not the index) of the relevant data record.\n",
    "\n",
    "Do not include information where the supporting evidence for it is not provided.\n",
    "\n",
    "\n",
    "---Target response length and format---\n",
    "\n",
    "{response_type}\n",
    "\n",
    "\n",
    "---Analyst Reports---\n",
    "\n",
    "{report_data}\n",
    "\n",
    "\n",
    "---Goal---\n",
    "\n",
    "Generate a response of the target length and format that responds to the user's question, summarize all the reports from multiple analysts who focused on different parts of the dataset.\n",
    "\n",
    "Note that the analysts' reports provided below are ranked in the **descending order of importance**.\n",
    "\n",
    "If you don't know the answer or if the provided reports do not contain sufficient information to provide an answer, just say so. Do not make anything up.\n",
    "\n",
    "The final response should remove all irrelevant information from the analysts' reports and merge the cleaned information into a comprehensive answer that provides explanations of all the key points and implications appropriate for the response length and format.\n",
    "\n",
    "The response shall preserve the original meaning and use of modal verbs such as \"shall\", \"may\" or \"will\".\n",
    "\n",
    "The response should also preserve all the data references previously included in the analysts' reports, but do not mention the roles of multiple analysts in the analysis process.\n",
    "\n",
    "**Do not list more than 5 record ids in a single reference**. Instead, list the top 5 most relevant record ids and add \"+more\" to indicate that there are more.\n",
    "\n",
    "For example:\n",
    "\n",
    "\"Person X is the owner of Company Y and subject to many allegations of wrongdoing [Data: Reports (2, 7, 34, 46, 64, +more)]. He is also CEO of company X [Data: Reports (1, 3)]\"\n",
    "\n",
    "where 1, 2, 3, 7, 34, 46, and 64 represent the id (not the index) of the relevant data record.\n",
    "\n",
    "Do not include information where the supporting evidence for it is not provided.\n",
    "\n",
    "\n",
    "---Target response length and format---\n",
    "\n",
    "{response_type}\n",
    "\n",
    "Add sections and commentary to the response as appropriate for the length and format. Style the response in markdown.\n",
    "\"\"\"\n",
    "\n",
    "reduce_prompt = ChatPromptTemplate.from_messages(\n",
    "    [\n",
    "        (\n",
    "            \"system\",\n",
    "            REDUCE_SYSTEM_PROMPT,\n",
    "        ),\n",
    "        (\n",
    "            \"human\",\n",
    "            \"{question}\",\n",
    "        ),\n",
    "    ]\n",
    ")\n",
    "reduce_chain = reduce_prompt | llm | StrOutputParser()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "a540069d-eaf3-4618-ad9d-ae3d9075c513",
   "metadata": {},
   "outputs": [],
   "source": [
    "graph = Neo4jGraph(\n",
    "    url=NEO4J_URI,\n",
    "    username=NEO4J_USERNAME,\n",
    "    password=NEO4J_PASSWORD,\n",
    "    refresh_schema=False,\n",
    ")\n",
    "\n",
    "response_type: str = \"multiple paragraphs\"\n",
    "\n",
    "\n",
    "def global_retriever(query: str, level: int, response_type: str = response_type) -> str:\n",
    "    community_data = graph.query(\n",
    "        \"\"\"\n",
    "    MATCH (c:__Community__)\n",
    "    WHERE c.level = $level\n",
    "    RETURN c.full_content AS output\n",
    "    \"\"\",\n",
    "        params={\"level\": level},\n",
    "    )\n",
    "    intermediate_results = []\n",
    "    for community in tqdm(community_data, desc=\"Processing communities\"):\n",
    "        intermediate_response = map_chain.invoke(\n",
    "            {\"question\": query, \"context_data\": community[\"output\"]}\n",
    "        )\n",
    "        intermediate_results.append(intermediate_response)\n",
    "    final_response = reduce_chain.invoke(\n",
    "        {\n",
    "            \"report_data\": intermediate_results,\n",
    "            \"question\": query,\n",
    "            \"response_type\": response_type,\n",
    "        }\n",
    "    )\n",
    "    return final_response"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "70d24c01-9121-41c3-9eaa-9f1984e4468e",
   "metadata": {},
   "source": [
    "Let's now test it."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "70451a68-274f-442f-8a2e-3b53cbafcd27",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Processing communities: 100%|██████████| 6/6 [00:35<00:00,  5.90s/it]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "### Overview of the Story\n",
      "\n",
      "The narrative primarily revolves around Ebenezer Scrooge, a miser with a deep aversion to Christmas and a cynical worldview. His transformation is sparked by the visitation of Jacob Marley's ghost, who serves as a catalyst for change by warning Scrooge of the dire consequences of his actions. This encounter leads to the appearance of three spirits—representing the past, present, and future—who guide Scrooge through moments of self-reflection, ultimately encouraging him to embrace the spirit of Christmas and human kindness [Data: Reports (32, 17, 99, 86, +more)].\n",
      "\n",
      "### Key Characters and Themes\n",
      "\n",
      "**Jacob Marley and the Spirits:**  \n",
      "Marley's ghost plays a vital role in instigating Scrooge's introspection, highlighting the weight of his past actions and the need for redemption. The three spirits that follow reveal to Scrooge the importance of compassion and community, emphasizing the potential for personal growth through empathy [Data: Reports (86, 17, 99, +more)].\n",
      "\n",
      "**The Cratchit Family:**  \n",
      "The Cratchit family significantly influences Scrooge's transformation, particularly through the character of Tiny Tim, who symbolizes hope and vulnerability amidst hardship. Scrooge's visions regarding their struggles lead him to develop empathy and ultimately decide to improve their circumstances, showcasing his commitment to positive change [Data: Reports (25, 158, 159, +more)].\n",
      "\n",
      "### Societal Implications\n",
      "\n",
      "Scrooge's transformation carries broader societal implications. His newfound generosity challenges the social norms of his time, promoting themes of inclusivity, kindness, and social responsibility. His evolving relationships with his nephew and the townspeople reflect a shift toward a more compassionate society, suggesting that individual transformation can inspire community-wide change [Data: Reports (99, 37, 104, 194, +more)].\n",
      "\n",
      "### Conclusion\n",
      "\n",
      "The enduring legacy of Scrooge's transformation serves as a symbol of hope and the possibility of change. The story emphasizes the power of empathy, introspection, and the spirit of giving, making it a timeless narrative that resonates with themes of redemption and the importance of familial love during the holiday season [Data: Reports (32, 102, 126, 148, 158, 159, +more)].\n"
     ]
    }
   ],
   "source": [
    "print(global_retriever(\"What is the story about?\", 2))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "024ab439-1744-4ad1-9e60-1616a31e0ba4",
   "metadata": {},
   "source": [
    "## Summary\n",
    "In this blog post we demonstrated how to integrate Microsoft's GraphRAG into Neo4j and implement retrievers using LangChain and LlamaIndex. This should allows you to integrate GraphRAG with other retrievers or agents seamlessly. The local retriever combines vector similarity search with graph traversal, while the global retriever iterates over community summaries to generate comprehensive responses. This implementation showcases the power of combining structured knowledge graphs with language models for enhanced information retrieval and question answering. It's important to note that there is room for customization and experimentation with such a knowledge graph, which we will look into in the next blog post."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fc5f4cb9-ea8c-49b4-852c-4bf017b7e1d0",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "38dd3e90-282e-43c0-8c9d-bfcb08e49302",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
